emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/etags-regen ad50128a36 3/6: Merge branch 'master' into scratch/e


From: Dmitry Gutov
Subject: scratch/etags-regen ad50128a36 3/6: Merge branch 'master' into scratch/etags-regen
Date: Mon, 11 Jul 2022 14:01:50 -0400 (EDT)

branch: scratch/etags-regen
commit ad50128a36ac6d378598db15d95e4bc9eeb9c469
Merge: 535c262606 e646cb4e7a
Author: Dmitry Gutov <dgutov@yandex.ru>
Commit: Dmitry Gutov <dgutov@yandex.ru>

    Merge branch 'master' into scratch/etags-regen
---
 .gitignore                                         |    2 +
 CONTRIBUTE                                         |    8 +
 admin/authors.el                                   |    2 +-
 admin/notes/unicode                                |   17 +-
 admin/unidata/Makefile.in                          |   10 +-
 admin/unidata/README                               |   34 +-
 admin/unidata/blocks.awk                           |   35 +-
 admin/unidata/emoji-sequences.txt                  | 1469 ++++++++++++++++++++
 admin/unidata/emoji-zwj-sequences.txt              | 1410 +++++++++++++++++++
 admin/unidata/emoji-zwj.awk                        |  111 ++
 configure.ac                                       |    8 +-
 doc/emacs/help.texi                                |   17 +
 doc/emacs/kmacro.texi                              |    6 +-
 doc/emacs/maintaining.texi                         |   18 +-
 doc/emacs/search.texi                              |    9 +
 doc/lispref/commands.texi                          |   22 +-
 doc/lispref/lists.texi                             |   14 +
 doc/lispref/searching.texi                         |    6 +-
 doc/lispref/windows.texi                           |    5 +
 doc/misc/eshell.texi                               |   12 +
 doc/misc/eww.texi                                  |    3 +-
 doc/misc/mh-e.texi                                 |    2 +-
 etc/AUTHORS                                        |    1 +
 etc/NEWS                                           |  201 ++-
 etc/PROBLEMS                                       |   18 +
 etc/refcards/refcard.tex                           |    8 +-
 lisp/align.el                                      |   34 +-
 lisp/allout.el                                     |   35 +-
 lisp/ansi-color.el                                 |    2 +-
 lisp/apropos.el                                    |    4 +-
 lisp/auth-source.el                                |   60 +-
 lisp/autoinsert.el                                 |    7 +-
 lisp/autorevert.el                                 |   13 +-
 lisp/bindings.el                                   |    9 +-
 lisp/bookmark.el                                   |   17 +-
 lisp/buff-menu.el                                  |    6 +-
 lisp/button.el                                     |   45 +-
 lisp/calc/calc-aent.el                             |    3 +-
 lisp/calc/calc-forms.el                            |   15 +-
 lisp/calc/calc-poly.el                             |    2 +-
 lisp/calc/calc.el                                  |   12 +-
 lisp/calc/calcalg3.el                              |    2 +-
 lisp/calculator.el                                 |    9 +-
 lisp/calendar/cal-tex.el                           |    4 +-
 lisp/calendar/diary-lib.el                         |    7 +-
 lisp/calendar/icalendar.el                         |    5 +-
 lisp/cedet/pulse.el                                |    6 +-
 lisp/cedet/semantic/symref/grep.el                 |   11 +-
 lisp/char-fold.el                                  |    2 +
 lisp/cmuscheme.el                                  |    2 +-
 lisp/comint.el                                     |    2 +-
 lisp/cus-edit.el                                   |    4 +-
 lisp/cus-theme.el                                  |    2 +
 lisp/dabbrev.el                                    |    3 +-
 lisp/dired-aux.el                                  |    6 +-
 lisp/dired-x.el                                    |    4 +-
 lisp/dired.el                                      |    5 +-
 lisp/display-fill-column-indicator.el              |    2 +-
 lisp/doc-view.el                                   |    2 +-
 lisp/dos-vars.el                                   |    6 +-
 lisp/edmacro.el                                    |   13 +-
 lisp/elec-pair.el                                  |   55 +-
 lisp/emacs-lisp/advice.el                          |    4 +-
 lisp/emacs-lisp/autoload.el                        |    8 +-
 lisp/emacs-lisp/backtrace.el                       |    2 +-
 lisp/emacs-lisp/byte-opt.el                        |    4 +-
 lisp/emacs-lisp/byte-run.el                        |   10 +-
 lisp/emacs-lisp/bytecomp.el                        |   10 +-
 lisp/emacs-lisp/cconv.el                           |    2 +
 lisp/emacs-lisp/checkdoc.el                        |  335 +++--
 lisp/emacs-lisp/cl-generic.el                      |    2 +-
 lisp/emacs-lisp/cl-macs.el                         |    6 +-
 lisp/emacs-lisp/comp-cstr.el                       |    2 +-
 lisp/emacs-lisp/comp.el                            |    9 +-
 lisp/emacs-lisp/debug.el                           |   14 +-
 lisp/emacs-lisp/derived.el                         |    2 +-
 lisp/emacs-lisp/edebug.el                          |    4 +-
 lisp/emacs-lisp/eieio-base.el                      |    2 +-
 lisp/emacs-lisp/elint.el                           |    2 +-
 lisp/emacs-lisp/ert.el                             |    4 +-
 lisp/emacs-lisp/ewoc.el                            |    2 +-
 lisp/emacs-lisp/faceup.el                          |    2 +-
 lisp/emacs-lisp/generator.el                       |    2 +-
 lisp/emacs-lisp/hierarchy.el                       |    5 +-
 lisp/emacs-lisp/lisp-mode.el                       |    2 +-
 lisp/emacs-lisp/map.el                             |   18 +-
 lisp/emacs-lisp/nadvice.el                         |    2 +-
 lisp/emacs-lisp/package.el                         |    4 +-
 lisp/emacs-lisp/pcase.el                           |    6 +-
 lisp/emacs-lisp/shortdoc.el                        |    3 +
 lisp/emacs-lisp/subr-x.el                          |    6 +-
 lisp/emacs-lisp/testcover.el                       |    2 +-
 lisp/emacs-lisp/timer.el                           |    2 +-
 lisp/emulation/cua-base.el                         |    4 +-
 lisp/emulation/cua-rect.el                         |    6 +-
 lisp/emulation/viper-ex.el                         |    6 +-
 lisp/emulation/viper-init.el                       |   63 +-
 lisp/emulation/viper-keym.el                       |    9 +-
 lisp/emulation/viper-mous.el                       |    3 +-
 lisp/emulation/viper-util.el                       |   10 +-
 lisp/epa-dired.el                                  |    2 +
 lisp/epa-file.el                                   |    3 +-
 lisp/epa-hook.el                                   |    2 +
 lisp/epa-mail.el                                   |    3 +-
 lisp/epa.el                                        |   11 +-
 lisp/epg.el                                        |   10 +-
 lisp/erc/erc-autoaway.el                           |    6 +-
 lisp/erc/erc-backend.el                            |   14 +-
 lisp/erc/erc-dcc.el                                |   23 +-
 lisp/erc/erc-fill.el                               |   12 +-
 lisp/erc/erc-identd.el                             |    3 +-
 lisp/erc/erc-join.el                               |    2 +-
 lisp/erc/erc-log.el                                |   10 +-
 lisp/erc/erc-match.el                              |    8 +-
 lisp/erc/erc-menu.el                               |    3 +-
 lisp/erc/erc-notify.el                             |    6 +-
 lisp/erc/erc-pcomplete.el                          |    3 +-
 lisp/erc/erc-sound.el                              |    2 +-
 lisp/erc/erc-stamp.el                              |   16 +-
 lisp/erc/erc-track.el                              |   38 +-
 lisp/erc/erc.el                                    |   90 +-
 lisp/eshell/em-pred.el                             |    2 +-
 lisp/eshell/em-term.el                             |    6 +-
 lisp/eshell/em-unix.el                             |    3 +-
 lisp/eshell/esh-cmd.el                             |    6 +-
 lisp/eshell/esh-module.el                          |    2 +
 lisp/eshell/esh-var.el                             |    2 +-
 lisp/face-remap.el                                 |    2 +-
 lisp/faces.el                                      |    4 +-
 lisp/ffap.el                                       |   10 +-
 lisp/fileloop.el                                   |    1 +
 lisp/files.el                                      |    4 +-
 lisp/filesets.el                                   |   14 +-
 lisp/find-dired.el                                 |    2 +-
 lisp/foldout.el                                    |    2 +-
 lisp/font-core.el                                  |    2 +
 lisp/forms.el                                      |    4 +-
 lisp/frame.el                                      |    5 +-
 lisp/gnus/gnus-art.el                              |    2 +-
 lisp/gnus/gnus-group.el                            |    3 +-
 lisp/gnus/gnus-msg.el                              |   24 +-
 lisp/gnus/gnus.el                                  |    4 +-
 lisp/gnus/mm-decode.el                             |    3 +-
 lisp/gnus/mm-uu.el                                 |    4 +-
 lisp/gnus/mm-view.el                               |   20 +-
 lisp/gnus/mml-smime.el                             |    8 +-
 lisp/gnus/mml1991.el                               |    3 +-
 lisp/gnus/mml2015.el                               |   19 +-
 lisp/help-fns.el                                   |   23 +-
 lisp/help.el                                       |    2 +-
 lisp/hexl.el                                       |    2 +-
 lisp/hi-lock.el                                    |    2 +-
 lisp/htmlfontify.el                                |  232 ++--
 lisp/image-dired.el                                |    4 +-
 lisp/imenu.el                                      |    3 +-
 lisp/indent.el                                     |   15 +-
 lisp/info-look.el                                  |    6 +-
 lisp/international/ccl.el                          |   13 +-
 lisp/international/characters.el                   |    8 +-
 lisp/international/quail.el                        |    3 +-
 lisp/international/robin.el                        |    3 +-
 lisp/isearch.el                                    |   10 +-
 lisp/jit-lock.el                                   |    2 +-
 lisp/jsonrpc.el                                    |    2 +-
 lisp/kmacro.el                                     |    6 +-
 lisp/language/burmese.el                           |    2 +-
 lisp/language/ethio-util.el                        |    4 +
 lisp/language/japan-util.el                        |    2 +-
 lisp/language/khmer.el                             |    2 +
 lisp/language/sinhala.el                           |    2 +
 lisp/language/tibetan.el                           |    4 +-
 lisp/language/tv-util.el                           |    2 +
 lisp/ldefs-boot.el                                 |    2 +-
 lisp/loadhist.el                                   |    3 +-
 lisp/loadup.el                                     |   11 +-
 lisp/locate.el                                     |    2 +-
 lisp/macros.el                                     |   13 +-
 lisp/mail/emacsbug.el                              |    2 +-
 lisp/mail/sendmail.el                              |   23 +
 lisp/mail/smtpmail.el                              |    6 +-
 lisp/menu-bar.el                                   |   11 +-
 lisp/mh-e/mh-seq.el                                |    2 +-
 lisp/minibuffer.el                                 |   27 +-
 lisp/mouse-drag.el                                 |    2 +-
 lisp/mouse.el                                      |   82 +-
 lisp/net/ange-ftp.el                               |   10 +-
 lisp/net/eudc-bob.el                               |   15 +-
 lisp/net/eudc-hotlist.el                           |    5 +-
 lisp/net/eudcb-ldap.el                             |    2 +-
 lisp/net/eww.el                                    |   40 +-
 lisp/net/hmac-def.el                               |    4 +-
 lisp/net/ldap.el                                   |    3 +-
 lisp/net/net-utils.el                              |    8 +-
 lisp/net/newst-backend.el                          |    2 +-
 lisp/net/ntlm.el                                   |   29 +-
 lisp/net/quickurl.el                               |    2 +-
 lisp/net/rlogin.el                                 |    4 +-
 lisp/net/sasl-ntlm.el                              |    4 +-
 lisp/net/soap-inspect.el                           |    2 +-
 lisp/net/socks.el                                  |    2 +-
 lisp/net/telnet.el                                 |   11 +-
 lisp/net/tramp-adb.el                              |    2 +-
 lisp/net/tramp-archive.el                          |    2 +-
 lisp/net/tramp-cmds.el                             |    2 +
 lisp/net/tramp-compat.el                           |   19 +-
 lisp/net/tramp-crypt.el                            |    8 +-
 lisp/net/tramp-fuse.el                             |    6 +-
 lisp/net/tramp-sh.el                               |   38 +-
 lisp/net/tramp-smb.el                              |    4 +-
 lisp/net/tramp.el                                  |   33 +-
 lisp/nxml/nxml-mode.el                             |    3 +-
 lisp/nxml/rng-loc.el                               |    4 +-
 lisp/nxml/rng-valid.el                             |    5 +-
 lisp/org/org-agenda.el                             |    4 +-
 lisp/org/ox-html.el                                |    2 +-
 lisp/outline.el                                    |   48 +-
 lisp/pcmpl-x.el                                    |    2 +
 lisp/play/5x5.el                                   |    6 +-
 lisp/play/doctor.el                                |    4 +-
 lisp/play/dunnet.el                                |   12 +-
 lisp/play/hanoi.el                                 |    2 +-
 lisp/play/mpuz.el                                  |    2 +-
 lisp/play/tetris.el                                |    2 +-
 lisp/printing.el                                   |   12 +-
 lisp/profiler.el                                   |    6 +-
 lisp/progmodes/autoconf.el                         |    2 +-
 lisp/progmodes/bug-reference.el                    |   31 +-
 lisp/progmodes/cc-bytecomp.el                      |   30 +-
 lisp/progmodes/cc-cmds.el                          |    5 +-
 lisp/progmodes/cc-defs.el                          |   14 +-
 lisp/progmodes/cc-engine.el                        |   10 +-
 lisp/progmodes/cc-fonts.el                         |    2 +-
 lisp/progmodes/cc-langs.el                         |    3 +-
 lisp/progmodes/cc-mode.el                          |    2 +-
 lisp/progmodes/cc-vars.el                          |    2 +-
 lisp/progmodes/cmacexp.el                          |    2 +-
 lisp/progmodes/compile.el                          |   10 +-
 lisp/progmodes/cperl-mode.el                       |    4 +-
 lisp/progmodes/cpp.el                              |    6 +-
 lisp/progmodes/dcl-mode.el                         |    4 +-
 lisp/progmodes/ebnf-yac.el                         |    2 +-
 lisp/progmodes/elisp-mode.el                       |   33 +-
 lisp/progmodes/f90.el                              |    6 +-
 lisp/progmodes/flymake.el                          |    4 +-
 lisp/progmodes/gdb-mi.el                           |    6 +-
 lisp/progmodes/grep.el                             |    4 +-
 lisp/progmodes/hideshow.el                         |    2 +-
 lisp/progmodes/idlw-help.el                        |   13 +-
 lisp/progmodes/idlwave.el                          |    4 +-
 lisp/progmodes/opascal.el                          |    5 +-
 lisp/progmodes/prog-mode.el                        |   37 +-
 lisp/progmodes/project.el                          |  109 +-
 lisp/progmodes/python.el                           |   18 +-
 lisp/progmodes/verilog-mode.el                     |   99 +-
 lisp/progmodes/vhdl-mode.el                        |   67 +-
 lisp/progmodes/which-func.el                       |   10 +-
 lisp/progmodes/xref.el                             |   66 +-
 lisp/rect.el                                       |    4 +-
 lisp/repeat.el                                     |    2 +-
 lisp/replace.el                                    |   13 +-
 lisp/ruler-mode.el                                 |    2 +-
 lisp/server.el                                     |    2 +-
 lisp/ses.el                                        |   10 +-
 lisp/shell.el                                      |    3 +-
 lisp/simple.el                                     |   18 +-
 lisp/so-long.el                                    |   65 +-
 lisp/sort.el                                       |    3 +-
 lisp/subr.el                                       |   61 +-
 lisp/tab-bar.el                                    |   50 +-
 lisp/tempo.el                                      |    2 +-
 lisp/term.el                                       |   41 +-
 lisp/textmodes/bib-mode.el                         |    2 +-
 lisp/textmodes/etc-authors-mode.el                 |  133 ++
 lisp/textmodes/flyspell.el                         |    2 +-
 lisp/textmodes/ispell.el                           |    3 +-
 lisp/textmodes/makeinfo.el                         |    7 +-
 lisp/textmodes/mhtml-mode.el                       |    2 +
 lisp/textmodes/refill.el                           |    2 +-
 lisp/textmodes/reftex-dcr.el                       |   19 +-
 lisp/textmodes/reftex-global.el                    |    6 +-
 lisp/textmodes/reftex-index.el                     |    6 +-
 lisp/textmodes/reftex-parse.el                     |    6 +-
 lisp/textmodes/reftex-vars.el                      |    9 +-
 lisp/textmodes/reftex.el                           |    2 +-
 lisp/textmodes/tex-mode.el                         |    2 +-
 lisp/textmodes/texinfmt.el                         |   14 +-
 lisp/thingatpt.el                                  |   42 +-
 lisp/transient.el                                  |    4 +-
 lisp/url/url-auth.el                               |    5 +-
 lisp/url/url-cache.el                              |    4 +-
 lisp/url/url-cid.el                                |    2 +
 lisp/url/url-dired.el                              |    2 +
 lisp/url/url-expand.el                             |    2 +
 lisp/url/url-gw.el                                 |    2 +
 lisp/url/url-handlers.el                           |    1 +
 lisp/url/url-http.el                               |   96 +-
 lisp/url/url-ldap.el                               |    2 +-
 lisp/url/url-misc.el                               |    2 +
 lisp/url/url-news.el                               |    2 +
 lisp/url/url-privacy.el                            |    2 +
 lisp/url/url-proxy.el                              |    2 +
 lisp/url/url-vars.el                               |    2 +
 lisp/vc/compare-w.el                               |    2 +-
 lisp/vc/diff.el                                    |   10 +-
 lisp/vc/ediff-diff.el                              |   32 +-
 lisp/vc/ediff-help.el                              |    5 +-
 lisp/vc/ediff-init.el                              |  221 ++-
 lisp/vc/ediff-mult.el                              |   63 +-
 lisp/vc/ediff-ptch.el                              |   25 +-
 lisp/vc/ediff-util.el                              |   60 +-
 lisp/vc/ediff-wind.el                              |   58 +-
 lisp/vc/ediff.el                                   |   15 +-
 lisp/vc/emerge.el                                  |  129 +-
 lisp/vc/log-view.el                                |    2 +-
 lisp/vc/pcvs.el                                    |   12 +-
 lisp/vc/smerge-mode.el                             |    2 +-
 lisp/vc/vc-annotate.el                             |    3 +
 lisp/vc/vc-dir.el                                  |   12 +-
 lisp/vc/vc-git.el                                  |   15 +-
 lisp/vc/vc-hg.el                                   |   13 +-
 lisp/vc/vc-hooks.el                                |    6 +-
 lisp/wdired.el                                     |    4 +-
 lisp/whitespace.el                                 |   69 +-
 lisp/wid-edit.el                                   |    7 +-
 lisp/woman.el                                      |    4 +-
 lisp/xwidget.el                                    |    4 +-
 src/Makefile.in                                    |   13 +-
 src/buffer.h                                       |   11 +
 src/coding.c                                       |    3 +-
 src/comp.c                                         |   44 +-
 src/data.c                                         |    2 +-
 src/dispnew.c                                      |    2 +-
 src/eval.c                                         |   25 -
 src/fileio.c                                       |    6 +-
 src/fns.c                                          |    2 +-
 src/keyboard.c                                     |   19 +-
 src/keymap.c                                       |   61 +-
 src/lisp.h                                         |   16 +-
 src/lread.c                                        |    3 +-
 src/minibuf.c                                      |   18 +-
 src/process.c                                      |    4 +-
 src/search.c                                       |    7 +
 src/xdisp.c                                        |    6 +
 src/xfaces.c                                       |    6 +-
 test/infra/Dockerfile.emba                         |    5 +-
 test/infra/gitlab-ci.yml                           |   14 +-
 test/lisp/auth-source-tests.el                     |  132 +-
 test/lisp/button-tests.el                          |    1 +
 test/lisp/electric-tests.el                        |    7 +-
 test/lisp/emacs-lisp/checkdoc-tests.el             |   30 +
 test/lisp/emacs-lisp/map-tests.el                  |   34 +-
 test/lisp/emacs-lisp/subr-x-tests.el               |   20 +-
 test/lisp/emacs-lisp/tabulated-list-test.el        |    2 +-
 test/lisp/files-tests.el                           |    2 +
 .../mh-e/{mh-xface-tests.el => mh-limit-tests.el}  |   28 +-
 test/lisp/mh-e/mh-utils-tests.el                   |  408 ++++++
 test/lisp/mh-e/mh-xface-tests.el                   |   15 +
 test/lisp/net/network-stream-tests.el              |    2 +-
 test/lisp/progmodes/python-tests.el                |   30 +-
 test/lisp/so-long-tests/so-long-tests.el           |    2 +-
 test/lisp/subr-tests.el                            |    9 +-
 test/lisp/url/url-auth-tests.el                    |    2 +-
 test/src/fileio-tests.el                           |    9 +
 test/src/fns-tests.el                              |   10 +-
 test/src/keymap-tests.el                           |    3 +-
 test/src/minibuf-tests.el                          |    2 +-
 366 files changed, 6785 insertions(+), 2060 deletions(-)

diff --git a/.gitignore b/.gitignore
index fcbc9cd7f4..e49e970d09 100644
--- a/.gitignore
+++ b/.gitignore
@@ -143,6 +143,7 @@ src/gl-stamp
 core
 core.*[0-9]
 gmon.out
+native-lisp/
 oo/
 oo-spd/
 src/*.map
@@ -212,6 +213,7 @@ etc/charsets/*.map
 lisp/international/charprop.el
 lisp/international/charscript.el
 lisp/international/cp51932.el
+lisp/international/emoji-zwj.el
 lisp/international/eucjp-ms.el
 lisp/international/uni-*.el
 lisp/language/pinyin.el
diff --git a/CONTRIBUTE b/CONTRIBUTE
index 2d70c4916c..023d026a6c 100644
--- a/CONTRIBUTE
+++ b/CONTRIBUTE
@@ -157,6 +157,14 @@ top-level directory.  Most tests are in the directory 
"test/".  From
 the "test/" directory, run "make <filename>" to run the tests for
 <filename>.el(c).  See "test/README" for more information.
 
+If you're making changes that involve the Emacs build system, please
+test 'out-of-tree' builds as well, i.e.:
+
+    mkdir emacs-build
+    cd emacs-build
+    ../path-to-emacs-sources/configure
+    make
+
 ** Commit messages
 
 Ordinarily, a change you commit should contain a log entry in its
diff --git a/admin/authors.el b/admin/authors.el
index b4e6c934b6..3dec23c191 100644
--- a/admin/authors.el
+++ b/admin/authors.el
@@ -1676,7 +1676,7 @@ list of their contributions.\n")
                (insert "\n "))
            (insert " " file))
          (insert "\n")))))
-    (insert "\nLocal" " Variables:\ncoding: "
+    (insert "\nLocal" " Variables:\nmode: etc-authors\ncoding: "
            (symbol-name authors-coding-system) "\nEnd:\n")
     (message "Generating buffer %s... done" buffer-name)
     (unless noninteractive
diff --git a/admin/notes/unicode b/admin/notes/unicode
index 9dc6f3bdca..21233ac281 100644
--- a/admin/notes/unicode
+++ b/admin/notes/unicode
@@ -17,13 +17,15 @@ Emacs uses the following files from the Unicode Character 
Database
   . NormalizationTest.txt
   . SpecialCasing.txt
   . emoji-data.txt
+  . emoji-zwj-sequences.txt
+  . emoji-sequences.txt
   . BidiCharacterTest.txt
 
-First, the first 8 files need to be copied into admin/unidata/, and
+First, the first 10 files need to be copied into admin/unidata/, and
 the file https://www.unicode.org/copyright.html should be copied over
-copyright.html in admin/unidata (that file and emoji-data.txt might
-need trailing whitespace removed before they can be committed to the
-Emacs repository).
+copyright.html in admin/unidata (some of them might need trailing
+whitespace removed before they can be committed to the Emacs
+repository).
 
 Then Emacs should be rebuilt for them to take effect.  Rebuilding
 Emacs updates several derived files elsewhere in the Emacs source
@@ -100,7 +102,7 @@ FONT-NAME-REGEXP is checked using `string-match'."
 (save-excursion
 (goto-char (point-min))
 (let (res char name ifont)
-  (while (re-search-forward "; Emoji [^(]+(\\(.\\)[).\uFE0F]" nil t)
+  (while (re-search-forward "; Emoji_Presentation [^(]+(\\(.\\)[).]" nil t)
     (setq char (aref (match-string 1) 0))
     (setq ifont (car (internal-char-font nil char)))
     (when ifont
@@ -112,6 +114,11 @@ FONT-NAME-REGEXP is checked using `string-match'."
       (princ (format "Font not matching '%s' was used for the following 
characters:\n%s"
                      font-name-regexp (reverse res))))))))
 
+Visit "emoji-zwj-sequences.txt" and "emoji-sequences.txt" with the
+rebuilt Emacs, and check that the sample sequences are composed
+properly.  Note that your emoji font might not have glyphs for the
+newest codepoints yet.
+
 Finally, etc/NEWS should be updated to announce the support for the
 new Unicode version.
 
diff --git a/admin/unidata/Makefile.in b/admin/unidata/Makefile.in
index c57803e922..a2a2e425ff 100644
--- a/admin/unidata/Makefile.in
+++ b/admin/unidata/Makefile.in
@@ -41,7 +41,7 @@ unifiles = $(addprefix ${unidir}/,$(sort $(shell sed -n 's/^[ 
\t][ \t]*${lparen}
 .PHONY: all
 
 all: ${top_srcdir}/src/macuvs.h ${unifiles} ${unidir}/charscript.el \
-  ${unidir}/charprop.el
+  ${unidir}/charprop.el ${unidir}/emoji-zwj.el
 
 ## Specify .elc as an order-only prereq so as to not needlessly rebuild
 ## target just because the .elc is missing.
@@ -86,6 +86,13 @@ ${unidir}/charscript.el: ${blocks}
 ${unidir}/charscript.el: ${srcdir}/Blocks.txt ${srcdir}/emoji-data.txt
        $(AM_V_GEN)$(AWK) -f ${blocks} $^ > $@
 
+.PHONY: emoji-zwj.el
+emoji-zwj.el: ${unidir}/emoji-zwj.el
+
+zwj = ${srcdir}/emoji-zwj.awk
+
+${unidir}/emoji-zwj.el: ${srcdir}/emoji-zwj-sequences.txt ${zwj}
+       $(AM_V_GEN)$(AWK) -f ${zwj} < $< > $@
 
 .PHONY: clean bootstrap-clean distclean maintainer-clean gen-clean
 
@@ -104,6 +111,7 @@ distclean: clean
 ## from a make target, we don't delete it here.
 gen-clean:
        rm -f ${unidir}/charscript.el*
+       rm -f ${unidir}/emoji-zwj.el*
        rm -f ${unifiles} ${unidir}/charprop.el
 ## ref: https://lists.gnu.org/r/emacs-devel/2013-11/msg01029.html
 
diff --git a/admin/unidata/README b/admin/unidata/README
index e1129e1866..656ee15c54 100644
--- a/admin/unidata/README
+++ b/admin/unidata/README
@@ -7,32 +7,40 @@ The names, URLs, and dates for these files are as follows.
 
 BidiBrackets.txt
 http://www.unicode.org/Public/UNIDATA/BidiBrackets.txt
-2017-04-20
+2021-06-30
 
 BidiMirroring.txt
 http://www.unicode.org/Public/UNIDATA/BidiMirroring.txt
-2017-04-20
-
-IVD_Sequences.txt
-http://www.unicode.org/ivd/
-2016-08-15
-
-UnicodeData.txt
-http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
-2017-03-07
+2021-08-08
 
 Blocks.txt
 http://www.unicode.org/Public/8.0.0/ucd/Blocks.txt
-2017-04-20
+2021-01-22
+
+IVD_Sequences.txt
+http://www.unicode.org/ivd/
+2020-11-06
 
 NormalizationTest.txt
 http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt
-2017-03-08
+2021-05-28
 
 SpecialCasing.txt
 http://unicode.org/Public/UNIDATA/SpecialCasing.txt
-2017-04-20
+2021-03-08
+
+UnicodeData.txt
+http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
+2021-07-06
 
 emoji-data.txt
 https://www.unicode.org/Public/14.0.0/ucd/emoji/emoji-data.txt
 2021-08-26
+
+emoji-zwj-sequences.txt
+https://www.unicode.org/Public/emoji/14.0/emoji-zwj-sequences.txt
+2021-06-08
+
+emoji-sequences.txt
+https://www.unicode.org/Public/emoji/14.0/emoji-sequences.txt
+2020-08-26
diff --git a/admin/unidata/blocks.awk b/admin/unidata/blocks.awk
index 575f7142f4..eab778cb1e 100755
--- a/admin/unidata/blocks.awk
+++ b/admin/unidata/blocks.awk
@@ -202,12 +202,7 @@ FILENAME ~ "Blocks.txt" && /^[0-9A-F]/ {
     }
 }
 
-# The space after 'Emoji' is significant in the next two rules.
-# This purposely and deliberately excludes codepoints <= 00FF
-FILENAME ~ "emoji-data.txt" && /^00[0-9A-F]{2}.*; Emoji / {
-    next
-}
-FILENAME ~ "emoji-data.txt" && /^[0-9A-F].*; Emoji / {
+FILENAME ~ "emoji-data.txt" && /^[0-9A-F].*; Emoji_Presentation / {
     sep = index($1, "..")
     len = length($1)
     if (sep > 0)  {
@@ -226,6 +221,34 @@ FILENAME ~ "emoji-data.txt" && /^[0-9A-F].*; Emoji / {
 }
 
 END {
+    ## These codepoints have Emoji_Presentation = No, but they are
+    ## used in emoji-sequences.txt and emoji-zwj-sequences.txt (with a
+    ## Variation Selector), so force them into the emoji script so
+    ## they will get composed correctly.  FIXME: delete this when we
+    ## can change the font used for a codepoint based on whether it's
+    ## followed by a VS (usually VS-16)
+    idx = 0
+    override_start[idx] = "1F3CB"
+    override_end[idx] = "1F3CC"
+    idx++
+    override_start[idx] = "1F3F3"
+    override_end[idx] = "1F3F4"
+    idx++
+    override_start[idx] = "1F441"
+    override_end[idx] = "1F441"
+    idx++
+    override_start[idx] = "1F575"
+    override_end[idx] = "1F575"
+
+    for (k in override_start)
+    {
+        i++
+        start[i] = override_start[k]
+        end[i] = override_end[k]
+        alt[i] = "emoji"
+        name[i] = "Autogenerated emoji (override)"
+    }
+
     print ";;; charscript.el --- character script table  -*- lexical-binding:t 
-*-"
     print ";;; Automatically generated from admin/unidata/Blocks.txt"
     print "(let (script-list)"
diff --git a/admin/unidata/emoji-sequences.txt 
b/admin/unidata/emoji-sequences.txt
new file mode 100644
index 0000000000..dedf7ff543
--- /dev/null
+++ b/admin/unidata/emoji-sequences.txt
@@ -0,0 +1,1469 @@
+# emoji-sequences.txt
+# Date: 2021-08-26, 17:22:22 GMT
+# © 2021 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in 
the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Emoji Sequence Data for UTS #51
+# Version: 14.0
+#
+# For documentation and usage, see http://www.unicode.org/reports/tr51
+#
+# Format:
+#   code_point(s) ; type_field ; description # comments
+# Fields:
+#   code_point(s): one or more code points in hex format, separated by spaces
+#   type_field, one of the following:
+#       Basic_Emoji
+#       Emoji_Keycap_Sequence
+#       RGI_Emoji_Flag_Sequence
+#       RGI_Emoji_Tag_Sequence
+#       RGI_Emoji_Modifier_Sequence
+#     The type_field is a convenience for parsing the emoji sequence files, 
and is not intended to be maintained as a property.
+#   short name: CLDR short name of sequence; characters may be escaped with 
\x{hex}.
+#
+# For the purpose of regular expressions, each of the type fields defines the 
name of
+# a binary property of strings. The short name of each property is the same as 
the long name.
+#
+# For the purpose of regular expressions, the property RGI_Emoji is defined as
+# a binary property of strings corresponding to ED-27 in UTS #51 Unicode Emoji.
+# That is, it is the union of the above properties plus RGI_Emoji_ZWJ_Sequence,
+# whose data is in emoji-zwj-sequences.txt.
+# The short name of RGI_Emoji is the same as the long name.
+#
+# Characters and sequences are listed in code point order. Users should be 
shown a more natural order.
+# See the CLDR collation order for Emoji.
+
+# ================================================
+
+# Basic_Emoji
+
+231A..231B    ; Basic_Emoji                  ; watch                           
                               # E0.6   [2] (⌚..⌛)
+23E9..23EC    ; Basic_Emoji                  ; fast-forward button             
                               # E0.6   [4] (⏩..⏬)
+23F0          ; Basic_Emoji                  ; alarm clock                     
                               # E0.6   [1] (⏰)
+23F3          ; Basic_Emoji                  ; hourglass not done              
                               # E0.6   [1] (⏳)
+25FD..25FE    ; Basic_Emoji                  ; white medium-small square       
                               # E0.6   [2] (◽..◾)
+2614..2615    ; Basic_Emoji                  ; umbrella with rain drops        
                               # E0.6   [2] (☔..☕)
+2648..2653    ; Basic_Emoji                  ; Aries                           
                               # E0.6  [12] (♈..♓)
+267F          ; Basic_Emoji                  ; wheelchair symbol               
                               # E0.6   [1] (♿)
+2693          ; Basic_Emoji                  ; anchor                          
                               # E0.6   [1] (⚓)
+26A1          ; Basic_Emoji                  ; high voltage                    
                               # E0.6   [1] (⚡)
+26AA..26AB    ; Basic_Emoji                  ; white circle                    
                               # E0.6   [2] (⚪..⚫)
+26BD..26BE    ; Basic_Emoji                  ; soccer ball                     
                               # E0.6   [2] (⚽..⚾)
+26C4..26C5    ; Basic_Emoji                  ; snowman without snow            
                               # E0.6   [2] (⛄..⛅)
+26CE          ; Basic_Emoji                  ; Ophiuchus                       
                               # E0.6   [1] (⛎)
+26D4          ; Basic_Emoji                  ; no entry                        
                               # E0.6   [1] (⛔)
+26EA          ; Basic_Emoji                  ; church                          
                               # E0.6   [1] (⛪)
+26F2..26F3    ; Basic_Emoji                  ; fountain                        
                               # E0.6   [2] (⛲..⛳)
+26F5          ; Basic_Emoji                  ; sailboat                        
                               # E0.6   [1] (⛵)
+26FA          ; Basic_Emoji                  ; tent                            
                               # E0.6   [1] (⛺)
+26FD          ; Basic_Emoji                  ; fuel pump                       
                               # E0.6   [1] (⛽)
+2705          ; Basic_Emoji                  ; check mark button               
                               # E0.6   [1] (✅)
+270A..270B    ; Basic_Emoji                  ; raised fist                     
                               # E0.6   [2] (✊..✋)
+2728          ; Basic_Emoji                  ; sparkles                        
                               # E0.6   [1] (✨)
+274C          ; Basic_Emoji                  ; cross mark                      
                               # E0.6   [1] (❌)
+274E          ; Basic_Emoji                  ; cross mark button               
                               # E0.6   [1] (❎)
+2753..2755    ; Basic_Emoji                  ; red question mark               
                               # E0.6   [3] (❓..❕)
+2757          ; Basic_Emoji                  ; red exclamation mark            
                               # E0.6   [1] (❗)
+2795..2797    ; Basic_Emoji                  ; plus                            
                               # E0.6   [3] (➕..➗)
+27B0          ; Basic_Emoji                  ; curly loop                      
                               # E0.6   [1] (➰)
+27BF          ; Basic_Emoji                  ; double curly loop               
                               # E1.0   [1] (➿)
+2B1B..2B1C    ; Basic_Emoji                  ; black large square              
                               # E0.6   [2] (⬛..⬜)
+2B50          ; Basic_Emoji                  ; star                            
                               # E0.6   [1] (⭐)
+2B55          ; Basic_Emoji                  ; hollow red circle               
                               # E0.6   [1] (⭕)
+1F004         ; Basic_Emoji                  ; mahjong red dragon              
                               # E0.6   [1] (🀄)
+1F0CF         ; Basic_Emoji                  ; joker                           
                               # E0.6   [1] (🃏)
+1F18E         ; Basic_Emoji                  ; AB button (blood type)          
                               # E0.6   [1] (🆎)
+1F191..1F19A  ; Basic_Emoji                  ; CL button                       
                               # E0.6  [10] (🆑..🆚)
+1F201         ; Basic_Emoji                  ; Japanese “here” button          
                               # E0.6   [1] (🈁)
+1F21A         ; Basic_Emoji                  ; Japanese “free of charge” 
button                               # E0.6   [1] (🈚)
+1F22F         ; Basic_Emoji                  ; Japanese “reserved” button      
                               # E0.6   [1] (🈯)
+1F232..1F236  ; Basic_Emoji                  ; Japanese “prohibited” button    
                               # E0.6   [5] (🈲..🈶)
+1F238..1F23A  ; Basic_Emoji                  ; Japanese “application” button   
                               # E0.6   [3] (🈸..🈺)
+1F250..1F251  ; Basic_Emoji                  ; Japanese “bargain” button       
                               # E0.6   [2] (🉐..🉑)
+1F300..1F30C  ; Basic_Emoji                  ; cyclone                         
                               # E0.6  [13] (🌀..🌌)
+1F30D..1F30E  ; Basic_Emoji                  ; globe showing Europe-Africa     
                               # E0.7   [2] (🌍..🌎)
+1F30F         ; Basic_Emoji                  ; globe showing Asia-Australia    
                               # E0.6   [1] (🌏)
+1F310         ; Basic_Emoji                  ; globe with meridians            
                               # E1.0   [1] (🌐)
+1F311         ; Basic_Emoji                  ; new moon                        
                               # E0.6   [1] (🌑)
+1F312         ; Basic_Emoji                  ; waxing crescent moon            
                               # E1.0   [1] (🌒)
+1F313..1F315  ; Basic_Emoji                  ; first quarter moon              
                               # E0.6   [3] (🌓..🌕)
+1F316..1F318  ; Basic_Emoji                  ; waning gibbous moon             
                               # E1.0   [3] (🌖..🌘)
+1F319         ; Basic_Emoji                  ; crescent moon                   
                               # E0.6   [1] (🌙)
+1F31A         ; Basic_Emoji                  ; new moon face                   
                               # E1.0   [1] (🌚)
+1F31B         ; Basic_Emoji                  ; first quarter moon face         
                               # E0.6   [1] (🌛)
+1F31C         ; Basic_Emoji                  ; last quarter moon face          
                               # E0.7   [1] (🌜)
+1F31D..1F31E  ; Basic_Emoji                  ; full moon face                  
                               # E1.0   [2] (🌝..🌞)
+1F31F..1F320  ; Basic_Emoji                  ; glowing star                    
                               # E0.6   [2] (🌟..🌠)
+1F32D..1F32F  ; Basic_Emoji                  ; hot dog                         
                               # E1.0   [3] (🌭..🌯)
+1F330..1F331  ; Basic_Emoji                  ; chestnut                        
                               # E0.6   [2] (🌰..🌱)
+1F332..1F333  ; Basic_Emoji                  ; evergreen tree                  
                               # E1.0   [2] (🌲..🌳)
+1F334..1F335  ; Basic_Emoji                  ; palm tree                       
                               # E0.6   [2] (🌴..🌵)
+1F337..1F34A  ; Basic_Emoji                  ; tulip                           
                               # E0.6  [20] (🌷..🍊)
+1F34B         ; Basic_Emoji                  ; lemon                           
                               # E1.0   [1] (🍋)
+1F34C..1F34F  ; Basic_Emoji                  ; banana                          
                               # E0.6   [4] (🍌..🍏)
+1F350         ; Basic_Emoji                  ; pear                            
                               # E1.0   [1] (🍐)
+1F351..1F37B  ; Basic_Emoji                  ; peach                           
                               # E0.6  [43] (🍑..🍻)
+1F37C         ; Basic_Emoji                  ; baby bottle                     
                               # E1.0   [1] (🍼)
+1F37E..1F37F  ; Basic_Emoji                  ; bottle with popping cork        
                               # E1.0   [2] (🍾..🍿)
+1F380..1F393  ; Basic_Emoji                  ; ribbon                          
                               # E0.6  [20] (🎀..🎓)
+1F3A0..1F3C4  ; Basic_Emoji                  ; carousel horse                  
                               # E0.6  [37] (🎠..🏄)
+1F3C5         ; Basic_Emoji                  ; sports medal                    
                               # E1.0   [1] (🏅)
+1F3C6         ; Basic_Emoji                  ; trophy                          
                               # E0.6   [1] (🏆)
+1F3C7         ; Basic_Emoji                  ; horse racing                    
                               # E1.0   [1] (🏇)
+1F3C8         ; Basic_Emoji                  ; american football               
                               # E0.6   [1] (🏈)
+1F3C9         ; Basic_Emoji                  ; rugby football                  
                               # E1.0   [1] (🏉)
+1F3CA         ; Basic_Emoji                  ; person swimming                 
                               # E0.6   [1] (🏊)
+1F3CF..1F3D3  ; Basic_Emoji                  ; cricket game                    
                               # E1.0   [5] (🏏..🏓)
+1F3E0..1F3E3  ; Basic_Emoji                  ; house                           
                               # E0.6   [4] (🏠..🏣)
+1F3E4         ; Basic_Emoji                  ; post office                     
                               # E1.0   [1] (🏤)
+1F3E5..1F3F0  ; Basic_Emoji                  ; hospital                        
                               # E0.6  [12] (🏥..🏰)
+1F3F4         ; Basic_Emoji                  ; black flag                      
                               # E1.0   [1] (🏴)
+1F3F8..1F407  ; Basic_Emoji                  ; badminton                       
                               # E1.0  [16] (🏸..🐇)
+1F408         ; Basic_Emoji                  ; cat                             
                               # E0.7   [1] (🐈)
+1F409..1F40B  ; Basic_Emoji                  ; dragon                          
                               # E1.0   [3] (🐉..🐋)
+1F40C..1F40E  ; Basic_Emoji                  ; snail                           
                               # E0.6   [3] (🐌..🐎)
+1F40F..1F410  ; Basic_Emoji                  ; ram                             
                               # E1.0   [2] (🐏..🐐)
+1F411..1F412  ; Basic_Emoji                  ; ewe                             
                               # E0.6   [2] (🐑..🐒)
+1F413         ; Basic_Emoji                  ; rooster                         
                               # E1.0   [1] (🐓)
+1F414         ; Basic_Emoji                  ; chicken                         
                               # E0.6   [1] (🐔)
+1F415         ; Basic_Emoji                  ; dog                             
                               # E0.7   [1] (🐕)
+1F416         ; Basic_Emoji                  ; pig                             
                               # E1.0   [1] (🐖)
+1F417..1F429  ; Basic_Emoji                  ; boar                            
                               # E0.6  [19] (🐗..🐩)
+1F42A         ; Basic_Emoji                  ; camel                           
                               # E1.0   [1] (🐪)
+1F42B..1F43E  ; Basic_Emoji                  ; two-hump camel                  
                               # E0.6  [20] (🐫..🐾)
+1F440         ; Basic_Emoji                  ; eyes                            
                               # E0.6   [1] (👀)
+1F442..1F464  ; Basic_Emoji                  ; ear                             
                               # E0.6  [35] (👂..👤)
+1F465         ; Basic_Emoji                  ; busts in silhouette             
                               # E1.0   [1] (👥)
+1F466..1F46B  ; Basic_Emoji                  ; boy                             
                               # E0.6   [6] (👦..👫)
+1F46C..1F46D  ; Basic_Emoji                  ; men holding hands               
                               # E1.0   [2] (👬..👭)
+1F46E..1F4AC  ; Basic_Emoji                  ; police officer                  
                               # E0.6  [63] (👮..💬)
+1F4AD         ; Basic_Emoji                  ; thought balloon                 
                               # E1.0   [1] (💭)
+1F4AE..1F4B5  ; Basic_Emoji                  ; white flower                    
                               # E0.6   [8] (💮..💵)
+1F4B6..1F4B7  ; Basic_Emoji                  ; euro banknote                   
                               # E1.0   [2] (💶..💷)
+1F4B8..1F4EB  ; Basic_Emoji                  ; money with wings                
                               # E0.6  [52] (💸..📫)
+1F4EC..1F4ED  ; Basic_Emoji                  ; open mailbox with raised flag   
                               # E0.7   [2] (📬..📭)
+1F4EE         ; Basic_Emoji                  ; postbox                         
                               # E0.6   [1] (📮)
+1F4EF         ; Basic_Emoji                  ; postal horn                     
                               # E1.0   [1] (📯)
+1F4F0..1F4F4  ; Basic_Emoji                  ; newspaper                       
                               # E0.6   [5] (📰..📴)
+1F4F5         ; Basic_Emoji                  ; no mobile phones                
                               # E1.0   [1] (📵)
+1F4F6..1F4F7  ; Basic_Emoji                  ; antenna bars                    
                               # E0.6   [2] (📶..📷)
+1F4F8         ; Basic_Emoji                  ; camera with flash               
                               # E1.0   [1] (📸)
+1F4F9..1F4FC  ; Basic_Emoji                  ; video camera                    
                               # E0.6   [4] (📹..📼)
+1F4FF..1F502  ; Basic_Emoji                  ; prayer beads                    
                               # E1.0   [4] (📿..🔂)
+1F503         ; Basic_Emoji                  ; clockwise vertical arrows       
                               # E0.6   [1] (🔃)
+1F504..1F507  ; Basic_Emoji                  ; counterclockwise arrows button  
                               # E1.0   [4] (🔄..🔇)
+1F508         ; Basic_Emoji                  ; speaker low volume              
                               # E0.7   [1] (🔈)
+1F509         ; Basic_Emoji                  ; speaker medium volume           
                               # E1.0   [1] (🔉)
+1F50A..1F514  ; Basic_Emoji                  ; speaker high volume             
                               # E0.6  [11] (🔊..🔔)
+1F515         ; Basic_Emoji                  ; bell with slash                 
                               # E1.0   [1] (🔕)
+1F516..1F52B  ; Basic_Emoji                  ; bookmark                        
                               # E0.6  [22] (🔖..🔫)
+1F52C..1F52D  ; Basic_Emoji                  ; microscope                      
                               # E1.0   [2] (🔬..🔭)
+1F52E..1F53D  ; Basic_Emoji                  ; crystal ball                    
                               # E0.6  [16] (🔮..🔽)
+1F54B..1F54E  ; Basic_Emoji                  ; kaaba                           
                               # E1.0   [4] (🕋..🕎)
+1F550..1F55B  ; Basic_Emoji                  ; one o’clock                     
                               # E0.6  [12] (🕐..🕛)
+1F55C..1F567  ; Basic_Emoji                  ; one-thirty                      
                               # E0.7  [12] (🕜..🕧)
+1F57A         ; Basic_Emoji                  ; man dancing                     
                               # E3.0   [1] (🕺)
+1F595..1F596  ; Basic_Emoji                  ; middle finger                   
                               # E1.0   [2] (🖕..🖖)
+1F5A4         ; Basic_Emoji                  ; black heart                     
                               # E3.0   [1] (🖤)
+1F5FB..1F5FF  ; Basic_Emoji                  ; mount fuji                      
                               # E0.6   [5] (🗻..🗿)
+1F600         ; Basic_Emoji                  ; grinning face                   
                               # E1.0   [1] (😀)
+1F601..1F606  ; Basic_Emoji                  ; beaming face with smiling eyes  
                               # E0.6   [6] (😁..😆)
+1F607..1F608  ; Basic_Emoji                  ; smiling face with halo          
                               # E1.0   [2] (😇..😈)
+1F609..1F60D  ; Basic_Emoji                  ; winking face                    
                               # E0.6   [5] (😉..😍)
+1F60E         ; Basic_Emoji                  ; smiling face with sunglasses    
                               # E1.0   [1] (😎)
+1F60F         ; Basic_Emoji                  ; smirking face                   
                               # E0.6   [1] (😏)
+1F610         ; Basic_Emoji                  ; neutral face                    
                               # E0.7   [1] (😐)
+1F611         ; Basic_Emoji                  ; expressionless face             
                               # E1.0   [1] (😑)
+1F612..1F614  ; Basic_Emoji                  ; unamused face                   
                               # E0.6   [3] (😒..😔)
+1F615         ; Basic_Emoji                  ; confused face                   
                               # E1.0   [1] (😕)
+1F616         ; Basic_Emoji                  ; confounded face                 
                               # E0.6   [1] (😖)
+1F617         ; Basic_Emoji                  ; kissing face                    
                               # E1.0   [1] (😗)
+1F618         ; Basic_Emoji                  ; face blowing a kiss             
                               # E0.6   [1] (😘)
+1F619         ; Basic_Emoji                  ; kissing face with smiling eyes  
                               # E1.0   [1] (😙)
+1F61A         ; Basic_Emoji                  ; kissing face with closed eyes   
                               # E0.6   [1] (😚)
+1F61B         ; Basic_Emoji                  ; face with tongue                
                               # E1.0   [1] (😛)
+1F61C..1F61E  ; Basic_Emoji                  ; winking face with tongue        
                               # E0.6   [3] (😜..😞)
+1F61F         ; Basic_Emoji                  ; worried face                    
                               # E1.0   [1] (😟)
+1F620..1F625  ; Basic_Emoji                  ; angry face                      
                               # E0.6   [6] (😠..😥)
+1F626..1F627  ; Basic_Emoji                  ; frowning face with open mouth   
                               # E1.0   [2] (😦..😧)
+1F628..1F62B  ; Basic_Emoji                  ; fearful face                    
                               # E0.6   [4] (😨..😫)
+1F62C         ; Basic_Emoji                  ; grimacing face                  
                               # E1.0   [1] (😬)
+1F62D         ; Basic_Emoji                  ; loudly crying face              
                               # E0.6   [1] (😭)
+1F62E..1F62F  ; Basic_Emoji                  ; face with open mouth            
                               # E1.0   [2] (😮..😯)
+1F630..1F633  ; Basic_Emoji                  ; anxious face with sweat         
                               # E0.6   [4] (😰..😳)
+1F634         ; Basic_Emoji                  ; sleeping face                   
                               # E1.0   [1] (😴)
+1F635         ; Basic_Emoji                  ; face with crossed-out eyes      
                               # E0.6   [1] (😵)
+1F636         ; Basic_Emoji                  ; face without mouth              
                               # E1.0   [1] (😶)
+1F637..1F640  ; Basic_Emoji                  ; face with medical mask          
                               # E0.6  [10] (😷..🙀)
+1F641..1F644  ; Basic_Emoji                  ; slightly frowning face          
                               # E1.0   [4] (🙁..🙄)
+1F645..1F64F  ; Basic_Emoji                  ; person gesturing NO             
                               # E0.6  [11] (🙅..🙏)
+1F680         ; Basic_Emoji                  ; rocket                          
                               # E0.6   [1] (🚀)
+1F681..1F682  ; Basic_Emoji                  ; helicopter                      
                               # E1.0   [2] (🚁..🚂)
+1F683..1F685  ; Basic_Emoji                  ; railway car                     
                               # E0.6   [3] (🚃..🚅)
+1F686         ; Basic_Emoji                  ; train                           
                               # E1.0   [1] (🚆)
+1F687         ; Basic_Emoji                  ; metro                           
                               # E0.6   [1] (🚇)
+1F688         ; Basic_Emoji                  ; light rail                      
                               # E1.0   [1] (🚈)
+1F689         ; Basic_Emoji                  ; station                         
                               # E0.6   [1] (🚉)
+1F68A..1F68B  ; Basic_Emoji                  ; tram                            
                               # E1.0   [2] (🚊..🚋)
+1F68C         ; Basic_Emoji                  ; bus                             
                               # E0.6   [1] (🚌)
+1F68D         ; Basic_Emoji                  ; oncoming bus                    
                               # E0.7   [1] (🚍)
+1F68E         ; Basic_Emoji                  ; trolleybus                      
                               # E1.0   [1] (🚎)
+1F68F         ; Basic_Emoji                  ; bus stop                        
                               # E0.6   [1] (🚏)
+1F690         ; Basic_Emoji                  ; minibus                         
                               # E1.0   [1] (🚐)
+1F691..1F693  ; Basic_Emoji                  ; ambulance                       
                               # E0.6   [3] (🚑..🚓)
+1F694         ; Basic_Emoji                  ; oncoming police car             
                               # E0.7   [1] (🚔)
+1F695         ; Basic_Emoji                  ; taxi                            
                               # E0.6   [1] (🚕)
+1F696         ; Basic_Emoji                  ; oncoming taxi                   
                               # E1.0   [1] (🚖)
+1F697         ; Basic_Emoji                  ; automobile                      
                               # E0.6   [1] (🚗)
+1F698         ; Basic_Emoji                  ; oncoming automobile             
                               # E0.7   [1] (🚘)
+1F699..1F69A  ; Basic_Emoji                  ; sport utility vehicle           
                               # E0.6   [2] (🚙..🚚)
+1F69B..1F6A1  ; Basic_Emoji                  ; articulated lorry               
                               # E1.0   [7] (🚛..🚡)
+1F6A2         ; Basic_Emoji                  ; ship                            
                               # E0.6   [1] (🚢)
+1F6A3         ; Basic_Emoji                  ; person rowing boat              
                               # E1.0   [1] (🚣)
+1F6A4..1F6A5  ; Basic_Emoji                  ; speedboat                       
                               # E0.6   [2] (🚤..🚥)
+1F6A6         ; Basic_Emoji                  ; vertical traffic light          
                               # E1.0   [1] (🚦)
+1F6A7..1F6AD  ; Basic_Emoji                  ; construction                    
                               # E0.6   [7] (🚧..🚭)
+1F6AE..1F6B1  ; Basic_Emoji                  ; litter in bin sign              
                               # E1.0   [4] (🚮..🚱)
+1F6B2         ; Basic_Emoji                  ; bicycle                         
                               # E0.6   [1] (🚲)
+1F6B3..1F6B5  ; Basic_Emoji                  ; no bicycles                     
                               # E1.0   [3] (🚳..🚵)
+1F6B6         ; Basic_Emoji                  ; person walking                  
                               # E0.6   [1] (🚶)
+1F6B7..1F6B8  ; Basic_Emoji                  ; no pedestrians                  
                               # E1.0   [2] (🚷..🚸)
+1F6B9..1F6BE  ; Basic_Emoji                  ; men’s room                      
                               # E0.6   [6] (🚹..🚾)
+1F6BF         ; Basic_Emoji                  ; shower                          
                               # E1.0   [1] (🚿)
+1F6C0         ; Basic_Emoji                  ; person taking bath              
                               # E0.6   [1] (🛀)
+1F6C1..1F6C5  ; Basic_Emoji                  ; bathtub                         
                               # E1.0   [5] (🛁..🛅)
+1F6CC         ; Basic_Emoji                  ; person in bed                   
                               # E1.0   [1] (🛌)
+1F6D0         ; Basic_Emoji                  ; place of worship                
                               # E1.0   [1] (🛐)
+1F6D1..1F6D2  ; Basic_Emoji                  ; stop sign                       
                               # E3.0   [2] (🛑..🛒)
+1F6D5         ; Basic_Emoji                  ; hindu temple                    
                               # E12.0  [1] (🛕)
+1F6D6..1F6D7  ; Basic_Emoji                  ; hut                             
                               # E13.0  [2] (🛖..🛗)
+1F6DD..1F6DF  ; Basic_Emoji                  ; playground slide                
                               # E14.0  [3] (🛝..🛟)
+1F6EB..1F6EC  ; Basic_Emoji                  ; airplane departure              
                               # E1.0   [2] (🛫..🛬)
+1F6F4..1F6F6  ; Basic_Emoji                  ; kick scooter                    
                               # E3.0   [3] (🛴..🛶)
+1F6F7..1F6F8  ; Basic_Emoji                  ; sled                            
                               # E5.0   [2] (🛷..🛸)
+1F6F9         ; Basic_Emoji                  ; skateboard                      
                               # E11.0  [1] (🛹)
+1F6FA         ; Basic_Emoji                  ; auto rickshaw                   
                               # E12.0  [1] (🛺)
+1F6FB..1F6FC  ; Basic_Emoji                  ; pickup truck                    
                               # E13.0  [2] (🛻..🛼)
+1F7E0..1F7EB  ; Basic_Emoji                  ; orange circle                   
                               # E12.0 [12] (🟠..🟫)
+1F7F0         ; Basic_Emoji                  ; heavy equals sign               
                               # E14.0  [1] (🟰)
+1F90C         ; Basic_Emoji                  ; pinched fingers                 
                               # E13.0  [1] (🤌)
+1F90D..1F90F  ; Basic_Emoji                  ; white heart                     
                               # E12.0  [3] (🤍..🤏)
+1F910..1F918  ; Basic_Emoji                  ; zipper-mouth face               
                               # E1.0   [9] (🤐..🤘)
+1F919..1F91E  ; Basic_Emoji                  ; call me hand                    
                               # E3.0   [6] (🤙..🤞)
+1F91F         ; Basic_Emoji                  ; love-you gesture                
                               # E5.0   [1] (🤟)
+1F920..1F927  ; Basic_Emoji                  ; cowboy hat face                 
                               # E3.0   [8] (🤠..🤧)
+1F928..1F92F  ; Basic_Emoji                  ; face with raised eyebrow        
                               # E5.0   [8] (🤨..🤯)
+1F930         ; Basic_Emoji                  ; pregnant woman                  
                               # E3.0   [1] (🤰)
+1F931..1F932  ; Basic_Emoji                  ; breast-feeding                  
                               # E5.0   [2] (🤱..🤲)
+1F933..1F93A  ; Basic_Emoji                  ; selfie                          
                               # E3.0   [8] (🤳..🤺)
+1F93C..1F93E  ; Basic_Emoji                  ; people wrestling                
                               # E3.0   [3] (🤼..🤾)
+1F93F         ; Basic_Emoji                  ; diving mask                     
                               # E12.0  [1] (🤿)
+1F940..1F945  ; Basic_Emoji                  ; wilted flower                   
                               # E3.0   [6] (🥀..🥅)
+1F947..1F94B  ; Basic_Emoji                  ; 1st place medal                 
                               # E3.0   [5] (🥇..🥋)
+1F94C         ; Basic_Emoji                  ; curling stone                   
                               # E5.0   [1] (🥌)
+1F94D..1F94F  ; Basic_Emoji                  ; lacrosse                        
                               # E11.0  [3] (🥍..🥏)
+1F950..1F95E  ; Basic_Emoji                  ; croissant                       
                               # E3.0  [15] (🥐..🥞)
+1F95F..1F96B  ; Basic_Emoji                  ; dumpling                        
                               # E5.0  [13] (🥟..🥫)
+1F96C..1F970  ; Basic_Emoji                  ; leafy green                     
                               # E11.0  [5] (🥬..🥰)
+1F971         ; Basic_Emoji                  ; yawning face                    
                               # E12.0  [1] (🥱)
+1F972         ; Basic_Emoji                  ; smiling face with tear          
                               # E13.0  [1] (🥲)
+1F973..1F976  ; Basic_Emoji                  ; partying face                   
                               # E11.0  [4] (🥳..🥶)
+1F977..1F978  ; Basic_Emoji                  ; ninja                           
                               # E13.0  [2] (🥷..🥸)
+1F979         ; Basic_Emoji                  ; face holding back tears         
                               # E14.0  [1] (🥹)
+1F97A         ; Basic_Emoji                  ; pleading face                   
                               # E11.0  [1] (🥺)
+1F97B         ; Basic_Emoji                  ; sari                            
                               # E12.0  [1] (🥻)
+1F97C..1F97F  ; Basic_Emoji                  ; lab coat                        
                               # E11.0  [4] (🥼..🥿)
+1F980..1F984  ; Basic_Emoji                  ; crab                            
                               # E1.0   [5] (🦀..🦄)
+1F985..1F991  ; Basic_Emoji                  ; eagle                           
                               # E3.0  [13] (🦅..🦑)
+1F992..1F997  ; Basic_Emoji                  ; giraffe                         
                               # E5.0   [6] (🦒..🦗)
+1F998..1F9A2  ; Basic_Emoji                  ; kangaroo                        
                               # E11.0 [11] (🦘..🦢)
+1F9A3..1F9A4  ; Basic_Emoji                  ; mammoth                         
                               # E13.0  [2] (🦣..🦤)
+1F9A5..1F9AA  ; Basic_Emoji                  ; sloth                           
                               # E12.0  [6] (🦥..🦪)
+1F9AB..1F9AD  ; Basic_Emoji                  ; beaver                          
                               # E13.0  [3] (🦫..🦭)
+1F9AE..1F9AF  ; Basic_Emoji                  ; guide dog                       
                               # E12.0  [2] (🦮..🦯)
+1F9B0..1F9B9  ; Basic_Emoji                  ; red hair                        
                               # E11.0 [10] (🦰..🦹)
+1F9BA..1F9BF  ; Basic_Emoji                  ; safety vest                     
                               # E12.0  [6] (🦺..🦿)
+1F9C0         ; Basic_Emoji                  ; cheese wedge                    
                               # E1.0   [1] (🧀)
+1F9C1..1F9C2  ; Basic_Emoji                  ; cupcake                         
                               # E11.0  [2] (🧁..🧂)
+1F9C3..1F9CA  ; Basic_Emoji                  ; beverage box                    
                               # E12.0  [8] (🧃..🧊)
+1F9CB         ; Basic_Emoji                  ; bubble tea                      
                               # E13.0  [1] (🧋)
+1F9CC         ; Basic_Emoji                  ; troll                           
                               # E14.0  [1] (🧌)
+1F9CD..1F9CF  ; Basic_Emoji                  ; person standing                 
                               # E12.0  [3] (🧍..🧏)
+1F9D0..1F9E6  ; Basic_Emoji                  ; face with monocle               
                               # E5.0  [23] (🧐..🧦)
+1F9E7..1F9FF  ; Basic_Emoji                  ; red envelope                    
                               # E11.0 [25] (🧧..🧿)
+1FA70..1FA73  ; Basic_Emoji                  ; ballet shoes                    
                               # E12.0  [4] (🩰..🩳)
+1FA74         ; Basic_Emoji                  ; thong sandal                    
                               # E13.0  [1] (🩴)
+1FA78..1FA7A  ; Basic_Emoji                  ; drop of blood                   
                               # E12.0  [3] (🩸..🩺)
+1FA7B..1FA7C  ; Basic_Emoji                  ; x-ray                           
                               # E14.0  [2] (🩻..🩼)
+1FA80..1FA82  ; Basic_Emoji                  ; yo-yo                           
                               # E12.0  [3] (🪀..🪂)
+1FA83..1FA86  ; Basic_Emoji                  ; boomerang                       
                               # E13.0  [4] (🪃..🪆)
+1FA90..1FA95  ; Basic_Emoji                  ; ringed planet                   
                               # E12.0  [6] (🪐..🪕)
+1FA96..1FAA8  ; Basic_Emoji                  ; military helmet                 
                               # E13.0 [19] (🪖..🪨)
+1FAA9..1FAAC  ; Basic_Emoji                  ; mirror ball                     
                               # E14.0  [4] (🪩..🪬)
+1FAB0..1FAB6  ; Basic_Emoji                  ; fly                             
                               # E13.0  [7] (🪰..🪶)
+1FAB7..1FABA  ; Basic_Emoji                  ; lotus                           
                               # E14.0  [4] (🪷..🪺)
+1FAC0..1FAC2  ; Basic_Emoji                  ; anatomical heart                
                               # E13.0  [3] (🫀..🫂)
+1FAC3..1FAC5  ; Basic_Emoji                  ; pregnant man                    
                               # E14.0  [3] (🫃..🫅)
+1FAD0..1FAD6  ; Basic_Emoji                  ; blueberries                     
                               # E13.0  [7] (🫐..🫖)
+1FAD7..1FAD9  ; Basic_Emoji                  ; pouring liquid                  
                               # E14.0  [3] (🫗..🫙)
+1FAE0..1FAE7  ; Basic_Emoji                  ; melting face                    
                               # E14.0  [8] (🫠..🫧)
+1FAF0..1FAF6  ; Basic_Emoji                  ; hand with index finger and 
thumb crossed                       # E14.0  [7] (🫰..🫶)
+00A9 FE0F     ; Basic_Emoji                  ; copyright                       
                               # E0.6   [1] (©️)
+00AE FE0F     ; Basic_Emoji                  ; registered                      
                               # E0.6   [1] (®️)
+203C FE0F     ; Basic_Emoji                  ; double exclamation mark         
                               # E0.6   [1] (‼️)
+2049 FE0F     ; Basic_Emoji                  ; exclamation question mark       
                               # E0.6   [1] (⁉️)
+2122 FE0F     ; Basic_Emoji                  ; trade mark                      
                               # E0.6   [1] (™️)
+2139 FE0F     ; Basic_Emoji                  ; information                     
                               # E0.6   [1] (ℹ️)
+2194 FE0F     ; Basic_Emoji                  ; left-right arrow                
                               # E0.6   [1] (↔️)
+2195 FE0F     ; Basic_Emoji                  ; up-down arrow                   
                               # E0.6   [1] (↕️)
+2196 FE0F     ; Basic_Emoji                  ; up-left arrow                   
                               # E0.6   [1] (↖️)
+2197 FE0F     ; Basic_Emoji                  ; up-right arrow                  
                               # E0.6   [1] (↗️)
+2198 FE0F     ; Basic_Emoji                  ; down-right arrow                
                               # E0.6   [1] (↘️)
+2199 FE0F     ; Basic_Emoji                  ; down-left arrow                 
                               # E0.6   [1] (↙️)
+21A9 FE0F     ; Basic_Emoji                  ; right arrow curving left        
                               # E0.6   [1] (↩️)
+21AA FE0F     ; Basic_Emoji                  ; left arrow curving right        
                               # E0.6   [1] (↪️)
+2328 FE0F     ; Basic_Emoji                  ; keyboard                        
                               # E1.0   [1] (⌨️)
+23CF FE0F     ; Basic_Emoji                  ; eject button                    
                               # E1.0   [1] (⏏️)
+23ED FE0F     ; Basic_Emoji                  ; next track button               
                               # E0.7   [1] (⏭️)
+23EE FE0F     ; Basic_Emoji                  ; last track button               
                               # E0.7   [1] (⏮️)
+23EF FE0F     ; Basic_Emoji                  ; play or pause button            
                               # E1.0   [1] (⏯️)
+23F1 FE0F     ; Basic_Emoji                  ; stopwatch                       
                               # E1.0   [1] (⏱️)
+23F2 FE0F     ; Basic_Emoji                  ; timer clock                     
                               # E1.0   [1] (⏲️)
+23F8 FE0F     ; Basic_Emoji                  ; pause button                    
                               # E0.7   [1] (⏸️)
+23F9 FE0F     ; Basic_Emoji                  ; stop button                     
                               # E0.7   [1] (⏹️)
+23FA FE0F     ; Basic_Emoji                  ; record button                   
                               # E0.7   [1] (⏺️)
+24C2 FE0F     ; Basic_Emoji                  ; circled M                       
                               # E0.6   [1] (Ⓜ️)
+25AA FE0F     ; Basic_Emoji                  ; black small square              
                               # E0.6   [1] (▪️)
+25AB FE0F     ; Basic_Emoji                  ; white small square              
                               # E0.6   [1] (▫️)
+25B6 FE0F     ; Basic_Emoji                  ; play button                     
                               # E0.6   [1] (▶️)
+25C0 FE0F     ; Basic_Emoji                  ; reverse button                  
                               # E0.6   [1] (◀️)
+25FB FE0F     ; Basic_Emoji                  ; white medium square             
                               # E0.6   [1] (◻️)
+25FC FE0F     ; Basic_Emoji                  ; black medium square             
                               # E0.6   [1] (◼️)
+2600 FE0F     ; Basic_Emoji                  ; sun                             
                               # E0.6   [1] (☀️)
+2601 FE0F     ; Basic_Emoji                  ; cloud                           
                               # E0.6   [1] (☁️)
+2602 FE0F     ; Basic_Emoji                  ; umbrella                        
                               # E0.7   [1] (☂️)
+2603 FE0F     ; Basic_Emoji                  ; snowman                         
                               # E0.7   [1] (☃️)
+2604 FE0F     ; Basic_Emoji                  ; comet                           
                               # E1.0   [1] (☄️)
+260E FE0F     ; Basic_Emoji                  ; telephone                       
                               # E0.6   [1] (☎️)
+2611 FE0F     ; Basic_Emoji                  ; check box with check            
                               # E0.6   [1] (☑️)
+2618 FE0F     ; Basic_Emoji                  ; shamrock                        
                               # E1.0   [1] (☘️)
+261D FE0F     ; Basic_Emoji                  ; index pointing up               
                               # E0.6   [1] (☝️)
+2620 FE0F     ; Basic_Emoji                  ; skull and crossbones            
                               # E1.0   [1] (☠️)
+2622 FE0F     ; Basic_Emoji                  ; radioactive                     
                               # E1.0   [1] (☢️)
+2623 FE0F     ; Basic_Emoji                  ; biohazard                       
                               # E1.0   [1] (☣️)
+2626 FE0F     ; Basic_Emoji                  ; orthodox cross                  
                               # E1.0   [1] (☦️)
+262A FE0F     ; Basic_Emoji                  ; star and crescent               
                               # E0.7   [1] (☪️)
+262E FE0F     ; Basic_Emoji                  ; peace symbol                    
                               # E1.0   [1] (☮️)
+262F FE0F     ; Basic_Emoji                  ; yin yang                        
                               # E0.7   [1] (☯️)
+2638 FE0F     ; Basic_Emoji                  ; wheel of dharma                 
                               # E0.7   [1] (☸️)
+2639 FE0F     ; Basic_Emoji                  ; frowning face                   
                               # E0.7   [1] (☹️)
+263A FE0F     ; Basic_Emoji                  ; smiling face                    
                               # E0.6   [1] (☺️)
+2640 FE0F     ; Basic_Emoji                  ; female sign                     
                               # E4.0   [1] (♀️)
+2642 FE0F     ; Basic_Emoji                  ; male sign                       
                               # E4.0   [1] (♂️)
+265F FE0F     ; Basic_Emoji                  ; chess pawn                      
                               # E11.0  [1] (♟️)
+2660 FE0F     ; Basic_Emoji                  ; spade suit                      
                               # E0.6   [1] (♠️)
+2663 FE0F     ; Basic_Emoji                  ; club suit                       
                               # E0.6   [1] (♣️)
+2665 FE0F     ; Basic_Emoji                  ; heart suit                      
                               # E0.6   [1] (♥️)
+2666 FE0F     ; Basic_Emoji                  ; diamond suit                    
                               # E0.6   [1] (♦️)
+2668 FE0F     ; Basic_Emoji                  ; hot springs                     
                               # E0.6   [1] (♨️)
+267B FE0F     ; Basic_Emoji                  ; recycling symbol                
                               # E0.6   [1] (♻️)
+267E FE0F     ; Basic_Emoji                  ; infinity                        
                               # E11.0  [1] (♾️)
+2692 FE0F     ; Basic_Emoji                  ; hammer and pick                 
                               # E1.0   [1] (⚒️)
+2694 FE0F     ; Basic_Emoji                  ; crossed swords                  
                               # E1.0   [1] (⚔️)
+2695 FE0F     ; Basic_Emoji                  ; medical symbol                  
                               # E4.0   [1] (⚕️)
+2696 FE0F     ; Basic_Emoji                  ; balance scale                   
                               # E1.0   [1] (⚖️)
+2697 FE0F     ; Basic_Emoji                  ; alembic                         
                               # E1.0   [1] (⚗️)
+2699 FE0F     ; Basic_Emoji                  ; gear                            
                               # E1.0   [1] (⚙️)
+269B FE0F     ; Basic_Emoji                  ; atom symbol                     
                               # E1.0   [1] (⚛️)
+269C FE0F     ; Basic_Emoji                  ; fleur-de-lis                    
                               # E1.0   [1] (⚜️)
+26A0 FE0F     ; Basic_Emoji                  ; warning                         
                               # E0.6   [1] (⚠️)
+26A7 FE0F     ; Basic_Emoji                  ; transgender symbol              
                               # E13.0  [1] (⚧️)
+26B0 FE0F     ; Basic_Emoji                  ; coffin                          
                               # E1.0   [1] (⚰️)
+26B1 FE0F     ; Basic_Emoji                  ; funeral urn                     
                               # E1.0   [1] (⚱️)
+26C8 FE0F     ; Basic_Emoji                  ; cloud with lightning and rain   
                               # E0.7   [1] (⛈️)
+26CF FE0F     ; Basic_Emoji                  ; pick                            
                               # E0.7   [1] (⛏️)
+26D1 FE0F     ; Basic_Emoji                  ; rescue worker’s helmet          
                               # E0.7   [1] (⛑️)
+26D3 FE0F     ; Basic_Emoji                  ; chains                          
                               # E0.7   [1] (⛓️)
+26E9 FE0F     ; Basic_Emoji                  ; shinto shrine                   
                               # E0.7   [1] (⛩️)
+26F0 FE0F     ; Basic_Emoji                  ; mountain                        
                               # E0.7   [1] (⛰️)
+26F1 FE0F     ; Basic_Emoji                  ; umbrella on ground              
                               # E0.7   [1] (⛱️)
+26F4 FE0F     ; Basic_Emoji                  ; ferry                           
                               # E0.7   [1] (⛴️)
+26F7 FE0F     ; Basic_Emoji                  ; skier                           
                               # E0.7   [1] (⛷️)
+26F8 FE0F     ; Basic_Emoji                  ; ice skate                       
                               # E0.7   [1] (⛸️)
+26F9 FE0F     ; Basic_Emoji                  ; person bouncing ball            
                               # E0.7   [1] (⛹️)
+2702 FE0F     ; Basic_Emoji                  ; scissors                        
                               # E0.6   [1] (✂️)
+2708 FE0F     ; Basic_Emoji                  ; airplane                        
                               # E0.6   [1] (✈️)
+2709 FE0F     ; Basic_Emoji                  ; envelope                        
                               # E0.6   [1] (✉️)
+270C FE0F     ; Basic_Emoji                  ; victory hand                    
                               # E0.6   [1] (✌️)
+270D FE0F     ; Basic_Emoji                  ; writing hand                    
                               # E0.7   [1] (✍️)
+270F FE0F     ; Basic_Emoji                  ; pencil                          
                               # E0.6   [1] (✏️)
+2712 FE0F     ; Basic_Emoji                  ; black nib                       
                               # E0.6   [1] (✒️)
+2714 FE0F     ; Basic_Emoji                  ; check mark                      
                               # E0.6   [1] (✔️)
+2716 FE0F     ; Basic_Emoji                  ; multiply                        
                               # E0.6   [1] (✖️)
+271D FE0F     ; Basic_Emoji                  ; latin cross                     
                               # E0.7   [1] (✝️)
+2721 FE0F     ; Basic_Emoji                  ; star of David                   
                               # E0.7   [1] (✡️)
+2733 FE0F     ; Basic_Emoji                  ; eight-spoked asterisk           
                               # E0.6   [1] (✳️)
+2734 FE0F     ; Basic_Emoji                  ; eight-pointed star              
                               # E0.6   [1] (✴️)
+2744 FE0F     ; Basic_Emoji                  ; snowflake                       
                               # E0.6   [1] (❄️)
+2747 FE0F     ; Basic_Emoji                  ; sparkle                         
                               # E0.6   [1] (❇️)
+2763 FE0F     ; Basic_Emoji                  ; heart exclamation               
                               # E1.0   [1] (❣️)
+2764 FE0F     ; Basic_Emoji                  ; red heart                       
                               # E0.6   [1] (❤️)
+27A1 FE0F     ; Basic_Emoji                  ; right arrow                     
                               # E0.6   [1] (➡️)
+2934 FE0F     ; Basic_Emoji                  ; right arrow curving up          
                               # E0.6   [1] (⤴️)
+2935 FE0F     ; Basic_Emoji                  ; right arrow curving down        
                               # E0.6   [1] (⤵️)
+2B05 FE0F     ; Basic_Emoji                  ; left arrow                      
                               # E0.6   [1] (⬅️)
+2B06 FE0F     ; Basic_Emoji                  ; up arrow                        
                               # E0.6   [1] (⬆️)
+2B07 FE0F     ; Basic_Emoji                  ; down arrow                      
                               # E0.6   [1] (⬇️)
+3030 FE0F     ; Basic_Emoji                  ; wavy dash                       
                               # E0.6   [1] (〰️)
+303D FE0F     ; Basic_Emoji                  ; part alternation mark           
                               # E0.6   [1] (〽️)
+3297 FE0F     ; Basic_Emoji                  ; Japanese “congratulations” 
button                              # E0.6   [1] (㊗️)
+3299 FE0F     ; Basic_Emoji                  ; Japanese “secret” button        
                               # E0.6   [1] (㊙️)
+1F170 FE0F    ; Basic_Emoji                  ; A button (blood type)           
                               # E0.6   [1] (🅰️)
+1F171 FE0F    ; Basic_Emoji                  ; B button (blood type)           
                               # E0.6   [1] (🅱️)
+1F17E FE0F    ; Basic_Emoji                  ; O button (blood type)           
                               # E0.6   [1] (🅾️)
+1F17F FE0F    ; Basic_Emoji                  ; P button                        
                               # E0.6   [1] (🅿️)
+1F202 FE0F    ; Basic_Emoji                  ; Japanese “service charge” 
button                               # E0.6   [1] (🈂️)
+1F237 FE0F    ; Basic_Emoji                  ; Japanese “monthly amount” 
button                               # E0.6   [1] (🈷️)
+1F321 FE0F    ; Basic_Emoji                  ; thermometer                     
                               # E0.7   [1] (🌡️)
+1F324 FE0F    ; Basic_Emoji                  ; sun behind small cloud          
                               # E0.7   [1] (🌤️)
+1F325 FE0F    ; Basic_Emoji                  ; sun behind large cloud          
                               # E0.7   [1] (🌥️)
+1F326 FE0F    ; Basic_Emoji                  ; sun behind rain cloud           
                               # E0.7   [1] (🌦️)
+1F327 FE0F    ; Basic_Emoji                  ; cloud with rain                 
                               # E0.7   [1] (🌧️)
+1F328 FE0F    ; Basic_Emoji                  ; cloud with snow                 
                               # E0.7   [1] (🌨️)
+1F329 FE0F    ; Basic_Emoji                  ; cloud with lightning            
                               # E0.7   [1] (🌩️)
+1F32A FE0F    ; Basic_Emoji                  ; tornado                         
                               # E0.7   [1] (🌪️)
+1F32B FE0F    ; Basic_Emoji                  ; fog                             
                               # E0.7   [1] (🌫️)
+1F32C FE0F    ; Basic_Emoji                  ; wind face                       
                               # E0.7   [1] (🌬️)
+1F336 FE0F    ; Basic_Emoji                  ; hot pepper                      
                               # E0.7   [1] (🌶️)
+1F37D FE0F    ; Basic_Emoji                  ; fork and knife with plate       
                               # E0.7   [1] (🍽️)
+1F396 FE0F    ; Basic_Emoji                  ; military medal                  
                               # E0.7   [1] (🎖️)
+1F397 FE0F    ; Basic_Emoji                  ; reminder ribbon                 
                               # E0.7   [1] (🎗️)
+1F399 FE0F    ; Basic_Emoji                  ; studio microphone               
                               # E0.7   [1] (🎙️)
+1F39A FE0F    ; Basic_Emoji                  ; level slider                    
                               # E0.7   [1] (🎚️)
+1F39B FE0F    ; Basic_Emoji                  ; control knobs                   
                               # E0.7   [1] (🎛️)
+1F39E FE0F    ; Basic_Emoji                  ; film frames                     
                               # E0.7   [1] (🎞️)
+1F39F FE0F    ; Basic_Emoji                  ; admission tickets               
                               # E0.7   [1] (🎟️)
+1F3CB FE0F    ; Basic_Emoji                  ; person lifting weights          
                               # E0.7   [1] (🏋️)
+1F3CC FE0F    ; Basic_Emoji                  ; person golfing                  
                               # E0.7   [1] (🏌️)
+1F3CD FE0F    ; Basic_Emoji                  ; motorcycle                      
                               # E0.7   [1] (🏍️)
+1F3CE FE0F    ; Basic_Emoji                  ; racing car                      
                               # E0.7   [1] (🏎️)
+1F3D4 FE0F    ; Basic_Emoji                  ; snow-capped mountain            
                               # E0.7   [1] (🏔️)
+1F3D5 FE0F    ; Basic_Emoji                  ; camping                         
                               # E0.7   [1] (🏕️)
+1F3D6 FE0F    ; Basic_Emoji                  ; beach with umbrella             
                               # E0.7   [1] (🏖️)
+1F3D7 FE0F    ; Basic_Emoji                  ; building construction           
                               # E0.7   [1] (🏗️)
+1F3D8 FE0F    ; Basic_Emoji                  ; houses                          
                               # E0.7   [1] (🏘️)
+1F3D9 FE0F    ; Basic_Emoji                  ; cityscape                       
                               # E0.7   [1] (🏙️)
+1F3DA FE0F    ; Basic_Emoji                  ; derelict house                  
                               # E0.7   [1] (🏚️)
+1F3DB FE0F    ; Basic_Emoji                  ; classical building              
                               # E0.7   [1] (🏛️)
+1F3DC FE0F    ; Basic_Emoji                  ; desert                          
                               # E0.7   [1] (🏜️)
+1F3DD FE0F    ; Basic_Emoji                  ; desert island                   
                               # E0.7   [1] (🏝️)
+1F3DE FE0F    ; Basic_Emoji                  ; national park                   
                               # E0.7   [1] (🏞️)
+1F3DF FE0F    ; Basic_Emoji                  ; stadium                         
                               # E0.7   [1] (🏟️)
+1F3F3 FE0F    ; Basic_Emoji                  ; white flag                      
                               # E0.7   [1] (🏳️)
+1F3F5 FE0F    ; Basic_Emoji                  ; rosette                         
                               # E0.7   [1] (🏵️)
+1F3F7 FE0F    ; Basic_Emoji                  ; label                           
                               # E0.7   [1] (🏷️)
+1F43F FE0F    ; Basic_Emoji                  ; chipmunk                        
                               # E0.7   [1] (🐿️)
+1F441 FE0F    ; Basic_Emoji                  ; eye                             
                               # E0.7   [1] (👁️)
+1F4FD FE0F    ; Basic_Emoji                  ; film projector                  
                               # E0.7   [1] (📽️)
+1F549 FE0F    ; Basic_Emoji                  ; om                              
                               # E0.7   [1] (🕉️)
+1F54A FE0F    ; Basic_Emoji                  ; dove                            
                               # E0.7   [1] (🕊️)
+1F56F FE0F    ; Basic_Emoji                  ; candle                          
                               # E0.7   [1] (🕯️)
+1F570 FE0F    ; Basic_Emoji                  ; mantelpiece clock               
                               # E0.7   [1] (🕰️)
+1F573 FE0F    ; Basic_Emoji                  ; hole                            
                               # E0.7   [1] (🕳️)
+1F574 FE0F    ; Basic_Emoji                  ; person in suit levitating       
                               # E0.7   [1] (🕴️)
+1F575 FE0F    ; Basic_Emoji                  ; detective                       
                               # E0.7   [1] (🕵️)
+1F576 FE0F    ; Basic_Emoji                  ; sunglasses                      
                               # E0.7   [1] (🕶️)
+1F577 FE0F    ; Basic_Emoji                  ; spider                          
                               # E0.7   [1] (🕷️)
+1F578 FE0F    ; Basic_Emoji                  ; spider web                      
                               # E0.7   [1] (🕸️)
+1F579 FE0F    ; Basic_Emoji                  ; joystick                        
                               # E0.7   [1] (🕹️)
+1F587 FE0F    ; Basic_Emoji                  ; linked paperclips               
                               # E0.7   [1] (🖇️)
+1F58A FE0F    ; Basic_Emoji                  ; pen                             
                               # E0.7   [1] (🖊️)
+1F58B FE0F    ; Basic_Emoji                  ; fountain pen                    
                               # E0.7   [1] (🖋️)
+1F58C FE0F    ; Basic_Emoji                  ; paintbrush                      
                               # E0.7   [1] (🖌️)
+1F58D FE0F    ; Basic_Emoji                  ; crayon                          
                               # E0.7   [1] (🖍️)
+1F590 FE0F    ; Basic_Emoji                  ; hand with fingers splayed       
                               # E0.7   [1] (🖐️)
+1F5A5 FE0F    ; Basic_Emoji                  ; desktop computer                
                               # E0.7   [1] (🖥️)
+1F5A8 FE0F    ; Basic_Emoji                  ; printer                         
                               # E0.7   [1] (🖨️)
+1F5B1 FE0F    ; Basic_Emoji                  ; computer mouse                  
                               # E0.7   [1] (🖱️)
+1F5B2 FE0F    ; Basic_Emoji                  ; trackball                       
                               # E0.7   [1] (🖲️)
+1F5BC FE0F    ; Basic_Emoji                  ; framed picture                  
                               # E0.7   [1] (🖼️)
+1F5C2 FE0F    ; Basic_Emoji                  ; card index dividers             
                               # E0.7   [1] (🗂️)
+1F5C3 FE0F    ; Basic_Emoji                  ; card file box                   
                               # E0.7   [1] (🗃️)
+1F5C4 FE0F    ; Basic_Emoji                  ; file cabinet                    
                               # E0.7   [1] (🗄️)
+1F5D1 FE0F    ; Basic_Emoji                  ; wastebasket                     
                               # E0.7   [1] (🗑️)
+1F5D2 FE0F    ; Basic_Emoji                  ; spiral notepad                  
                               # E0.7   [1] (🗒️)
+1F5D3 FE0F    ; Basic_Emoji                  ; spiral calendar                 
                               # E0.7   [1] (🗓️)
+1F5DC FE0F    ; Basic_Emoji                  ; clamp                           
                               # E0.7   [1] (🗜️)
+1F5DD FE0F    ; Basic_Emoji                  ; old key                         
                               # E0.7   [1] (🗝️)
+1F5DE FE0F    ; Basic_Emoji                  ; rolled-up newspaper             
                               # E0.7   [1] (🗞️)
+1F5E1 FE0F    ; Basic_Emoji                  ; dagger                          
                               # E0.7   [1] (🗡️)
+1F5E3 FE0F    ; Basic_Emoji                  ; speaking head                   
                               # E0.7   [1] (🗣️)
+1F5E8 FE0F    ; Basic_Emoji                  ; left speech bubble              
                               # E2.0   [1] (🗨️)
+1F5EF FE0F    ; Basic_Emoji                  ; right anger bubble              
                               # E0.7   [1] (🗯️)
+1F5F3 FE0F    ; Basic_Emoji                  ; ballot box with ballot          
                               # E0.7   [1] (🗳️)
+1F5FA FE0F    ; Basic_Emoji                  ; world map                       
                               # E0.7   [1] (🗺️)
+1F6CB FE0F    ; Basic_Emoji                  ; couch and lamp                  
                               # E0.7   [1] (🛋️)
+1F6CD FE0F    ; Basic_Emoji                  ; shopping bags                   
                               # E0.7   [1] (🛍️)
+1F6CE FE0F    ; Basic_Emoji                  ; bellhop bell                    
                               # E0.7   [1] (🛎️)
+1F6CF FE0F    ; Basic_Emoji                  ; bed                             
                               # E0.7   [1] (🛏️)
+1F6E0 FE0F    ; Basic_Emoji                  ; hammer and wrench               
                               # E0.7   [1] (🛠️)
+1F6E1 FE0F    ; Basic_Emoji                  ; shield                          
                               # E0.7   [1] (🛡️)
+1F6E2 FE0F    ; Basic_Emoji                  ; oil drum                        
                               # E0.7   [1] (🛢️)
+1F6E3 FE0F    ; Basic_Emoji                  ; motorway                        
                               # E0.7   [1] (🛣️)
+1F6E4 FE0F    ; Basic_Emoji                  ; railway track                   
                               # E0.7   [1] (🛤️)
+1F6E5 FE0F    ; Basic_Emoji                  ; motor boat                      
                               # E0.7   [1] (🛥️)
+1F6E9 FE0F    ; Basic_Emoji                  ; small airplane                  
                               # E0.7   [1] (🛩️)
+1F6F0 FE0F    ; Basic_Emoji                  ; satellite                       
                               # E0.7   [1] (🛰️)
+1F6F3 FE0F    ; Basic_Emoji                  ; passenger ship                  
                               # E0.7   [1] (🛳️)
+
+# Total elements: 1366
+
+# ================================================
+
+# Emoji_Keycap_Sequence
+
+0023 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: \x{23}                  
                               # E0.6   [1] (#️⃣)
+002A FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: *                       
                               # E2.0   [1] (*️⃣)
+0030 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 0                       
                               # E0.6   [1] (0️⃣)
+0031 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 1                       
                               # E0.6   [1] (1️⃣)
+0032 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 2                       
                               # E0.6   [1] (2️⃣)
+0033 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 3                       
                               # E0.6   [1] (3️⃣)
+0034 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 4                       
                               # E0.6   [1] (4️⃣)
+0035 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 5                       
                               # E0.6   [1] (5️⃣)
+0036 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 6                       
                               # E0.6   [1] (6️⃣)
+0037 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 7                       
                               # E0.6   [1] (7️⃣)
+0038 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 8                       
                               # E0.6   [1] (8️⃣)
+0039 FE0F 20E3; Emoji_Keycap_Sequence        ; keycap: 9                       
                               # E0.6   [1] (9️⃣)
+
+# Total elements: 12
+
+# ================================================
+
+# RGI_Emoji_Flag_Sequence: This list does not include deprecated or 
macroregion flags, except for UN and EU.
+# See Annex B of TR51 for more information.
+
+1F1E6 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: Ascension Island          
                               # E2.0   [1] (🇦🇨)
+1F1E6 1F1E9   ; RGI_Emoji_Flag_Sequence      ; flag: Andorra                   
                               # E2.0   [1] (🇦🇩)
+1F1E6 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: United Arab Emirates      
                               # E2.0   [1] (🇦🇪)
+1F1E6 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: Afghanistan               
                               # E2.0   [1] (🇦🇫)
+1F1E6 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Antigua & Barbuda         
                               # E2.0   [1] (🇦🇬)
+1F1E6 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Anguilla                  
                               # E2.0   [1] (🇦🇮)
+1F1E6 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Albania                   
                               # E2.0   [1] (🇦🇱)
+1F1E6 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Armenia                   
                               # E2.0   [1] (🇦🇲)
+1F1E6 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Angola                    
                               # E2.0   [1] (🇦🇴)
+1F1E6 1F1F6   ; RGI_Emoji_Flag_Sequence      ; flag: Antarctica                
                               # E2.0   [1] (🇦🇶)
+1F1E6 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Argentina                 
                               # E2.0   [1] (🇦🇷)
+1F1E6 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: American Samoa            
                               # E2.0   [1] (🇦🇸)
+1F1E6 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Austria                   
                               # E2.0   [1] (🇦🇹)
+1F1E6 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Australia                 
                               # E2.0   [1] (🇦🇺)
+1F1E6 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Aruba                     
                               # E2.0   [1] (🇦🇼)
+1F1E6 1F1FD   ; RGI_Emoji_Flag_Sequence      ; flag: Åland Islands             
                               # E2.0   [1] (🇦🇽)
+1F1E6 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Azerbaijan                
                               # E2.0   [1] (🇦🇿)
+1F1E7 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Bosnia & Herzegovina      
                               # E2.0   [1] (🇧🇦)
+1F1E7 1F1E7   ; RGI_Emoji_Flag_Sequence      ; flag: Barbados                  
                               # E2.0   [1] (🇧🇧)
+1F1E7 1F1E9   ; RGI_Emoji_Flag_Sequence      ; flag: Bangladesh                
                               # E2.0   [1] (🇧🇩)
+1F1E7 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Belgium                   
                               # E2.0   [1] (🇧🇪)
+1F1E7 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: Burkina Faso              
                               # E2.0   [1] (🇧🇫)
+1F1E7 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Bulgaria                  
                               # E2.0   [1] (🇧🇬)
+1F1E7 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: Bahrain                   
                               # E2.0   [1] (🇧🇭)
+1F1E7 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Burundi                   
                               # E2.0   [1] (🇧🇮)
+1F1E7 1F1EF   ; RGI_Emoji_Flag_Sequence      ; flag: Benin                     
                               # E2.0   [1] (🇧🇯)
+1F1E7 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: St. Barthélemy            
                               # E2.0   [1] (🇧🇱)
+1F1E7 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Bermuda                   
                               # E2.0   [1] (🇧🇲)
+1F1E7 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: Brunei                    
                               # E2.0   [1] (🇧🇳)
+1F1E7 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Bolivia                   
                               # E2.0   [1] (🇧🇴)
+1F1E7 1F1F6   ; RGI_Emoji_Flag_Sequence      ; flag: Caribbean Netherlands     
                               # E2.0   [1] (🇧🇶)
+1F1E7 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Brazil                    
                               # E2.0   [1] (🇧🇷)
+1F1E7 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: Bahamas                   
                               # E2.0   [1] (🇧🇸)
+1F1E7 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Bhutan                    
                               # E2.0   [1] (🇧🇹)
+1F1E7 1F1FB   ; RGI_Emoji_Flag_Sequence      ; flag: Bouvet Island             
                               # E2.0   [1] (🇧🇻)
+1F1E7 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Botswana                  
                               # E2.0   [1] (🇧🇼)
+1F1E7 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Belarus                   
                               # E2.0   [1] (🇧🇾)
+1F1E7 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Belize                    
                               # E2.0   [1] (🇧🇿)
+1F1E8 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Canada                    
                               # E2.0   [1] (🇨🇦)
+1F1E8 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: Cocos (Keeling) Islands   
                               # E2.0   [1] (🇨🇨)
+1F1E8 1F1E9   ; RGI_Emoji_Flag_Sequence      ; flag: Congo - Kinshasa          
                               # E2.0   [1] (🇨🇩)
+1F1E8 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: Central African Republic  
                               # E2.0   [1] (🇨🇫)
+1F1E8 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Congo - Brazzaville       
                               # E2.0   [1] (🇨🇬)
+1F1E8 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: Switzerland               
                               # E2.0   [1] (🇨🇭)
+1F1E8 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Côte d’Ivoire             
                               # E2.0   [1] (🇨🇮)
+1F1E8 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Cook Islands              
                               # E2.0   [1] (🇨🇰)
+1F1E8 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Chile                     
                               # E2.0   [1] (🇨🇱)
+1F1E8 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Cameroon                  
                               # E2.0   [1] (🇨🇲)
+1F1E8 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: China                     
                               # E0.6   [1] (🇨🇳)
+1F1E8 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Colombia                  
                               # E2.0   [1] (🇨🇴)
+1F1E8 1F1F5   ; RGI_Emoji_Flag_Sequence      ; flag: Clipperton Island         
                               # E2.0   [1] (🇨🇵)
+1F1E8 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Costa Rica                
                               # E2.0   [1] (🇨🇷)
+1F1E8 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Cuba                      
                               # E2.0   [1] (🇨🇺)
+1F1E8 1F1FB   ; RGI_Emoji_Flag_Sequence      ; flag: Cape Verde                
                               # E2.0   [1] (🇨🇻)
+1F1E8 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Curaçao                   
                               # E2.0   [1] (🇨🇼)
+1F1E8 1F1FD   ; RGI_Emoji_Flag_Sequence      ; flag: Christmas Island          
                               # E2.0   [1] (🇨🇽)
+1F1E8 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Cyprus                    
                               # E2.0   [1] (🇨🇾)
+1F1E8 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Czechia                   
                               # E2.0   [1] (🇨🇿)
+1F1E9 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Germany                   
                               # E0.6   [1] (🇩🇪)
+1F1E9 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Diego Garcia              
                               # E2.0   [1] (🇩🇬)
+1F1E9 1F1EF   ; RGI_Emoji_Flag_Sequence      ; flag: Djibouti                  
                               # E2.0   [1] (🇩🇯)
+1F1E9 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Denmark                   
                               # E2.0   [1] (🇩🇰)
+1F1E9 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Dominica                  
                               # E2.0   [1] (🇩🇲)
+1F1E9 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Dominican Republic        
                               # E2.0   [1] (🇩🇴)
+1F1E9 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Algeria                   
                               # E2.0   [1] (🇩🇿)
+1F1EA 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Ceuta & Melilla           
                               # E2.0   [1] (🇪🇦)
+1F1EA 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: Ecuador                   
                               # E2.0   [1] (🇪🇨)
+1F1EA 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Estonia                   
                               # E2.0   [1] (🇪🇪)
+1F1EA 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Egypt                     
                               # E2.0   [1] (🇪🇬)
+1F1EA 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: Western Sahara            
                               # E2.0   [1] (🇪🇭)
+1F1EA 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Eritrea                   
                               # E2.0   [1] (🇪🇷)
+1F1EA 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: Spain                     
                               # E0.6   [1] (🇪🇸)
+1F1EA 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Ethiopia                  
                               # E2.0   [1] (🇪🇹)
+1F1EA 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: European Union            
                               # E2.0   [1] (🇪🇺)
+1F1EB 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Finland                   
                               # E2.0   [1] (🇫🇮)
+1F1EB 1F1EF   ; RGI_Emoji_Flag_Sequence      ; flag: Fiji                      
                               # E2.0   [1] (🇫🇯)
+1F1EB 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Falkland Islands          
                               # E2.0   [1] (🇫🇰)
+1F1EB 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Micronesia                
                               # E2.0   [1] (🇫🇲)
+1F1EB 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Faroe Islands             
                               # E2.0   [1] (🇫🇴)
+1F1EB 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: France                    
                               # E0.6   [1] (🇫🇷)
+1F1EC 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Gabon                     
                               # E2.0   [1] (🇬🇦)
+1F1EC 1F1E7   ; RGI_Emoji_Flag_Sequence      ; flag: United Kingdom            
                               # E0.6   [1] (🇬🇧)
+1F1EC 1F1E9   ; RGI_Emoji_Flag_Sequence      ; flag: Grenada                   
                               # E2.0   [1] (🇬🇩)
+1F1EC 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Georgia                   
                               # E2.0   [1] (🇬🇪)
+1F1EC 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: French Guiana             
                               # E2.0   [1] (🇬🇫)
+1F1EC 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Guernsey                  
                               # E2.0   [1] (🇬🇬)
+1F1EC 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: Ghana                     
                               # E2.0   [1] (🇬🇭)
+1F1EC 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Gibraltar                 
                               # E2.0   [1] (🇬🇮)
+1F1EC 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Greenland                 
                               # E2.0   [1] (🇬🇱)
+1F1EC 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Gambia                    
                               # E2.0   [1] (🇬🇲)
+1F1EC 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: Guinea                    
                               # E2.0   [1] (🇬🇳)
+1F1EC 1F1F5   ; RGI_Emoji_Flag_Sequence      ; flag: Guadeloupe                
                               # E2.0   [1] (🇬🇵)
+1F1EC 1F1F6   ; RGI_Emoji_Flag_Sequence      ; flag: Equatorial Guinea         
                               # E2.0   [1] (🇬🇶)
+1F1EC 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Greece                    
                               # E2.0   [1] (🇬🇷)
+1F1EC 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: South Georgia & South 
Sandwich Islands                   # E2.0   [1] (🇬🇸)
+1F1EC 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Guatemala                 
                               # E2.0   [1] (🇬🇹)
+1F1EC 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Guam                      
                               # E2.0   [1] (🇬🇺)
+1F1EC 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Guinea-Bissau             
                               # E2.0   [1] (🇬🇼)
+1F1EC 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Guyana                    
                               # E2.0   [1] (🇬🇾)
+1F1ED 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Hong Kong SAR China       
                               # E2.0   [1] (🇭🇰)
+1F1ED 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Heard & McDonald Islands  
                               # E2.0   [1] (🇭🇲)
+1F1ED 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: Honduras                  
                               # E2.0   [1] (🇭🇳)
+1F1ED 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Croatia                   
                               # E2.0   [1] (🇭🇷)
+1F1ED 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Haiti                     
                               # E2.0   [1] (🇭🇹)
+1F1ED 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Hungary                   
                               # E2.0   [1] (🇭🇺)
+1F1EE 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: Canary Islands            
                               # E2.0   [1] (🇮🇨)
+1F1EE 1F1E9   ; RGI_Emoji_Flag_Sequence      ; flag: Indonesia                 
                               # E2.0   [1] (🇮🇩)
+1F1EE 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Ireland                   
                               # E2.0   [1] (🇮🇪)
+1F1EE 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Israel                    
                               # E2.0   [1] (🇮🇱)
+1F1EE 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Isle of Man               
                               # E2.0   [1] (🇮🇲)
+1F1EE 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: India                     
                               # E2.0   [1] (🇮🇳)
+1F1EE 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: British Indian Ocean 
Territory                           # E2.0   [1] (🇮🇴)
+1F1EE 1F1F6   ; RGI_Emoji_Flag_Sequence      ; flag: Iraq                      
                               # E2.0   [1] (🇮🇶)
+1F1EE 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Iran                      
                               # E2.0   [1] (🇮🇷)
+1F1EE 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: Iceland                   
                               # E2.0   [1] (🇮🇸)
+1F1EE 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Italy                     
                               # E0.6   [1] (🇮🇹)
+1F1EF 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Jersey                    
                               # E2.0   [1] (🇯🇪)
+1F1EF 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Jamaica                   
                               # E2.0   [1] (🇯🇲)
+1F1EF 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Jordan                    
                               # E2.0   [1] (🇯🇴)
+1F1EF 1F1F5   ; RGI_Emoji_Flag_Sequence      ; flag: Japan                     
                               # E0.6   [1] (🇯🇵)
+1F1F0 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Kenya                     
                               # E2.0   [1] (🇰🇪)
+1F1F0 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Kyrgyzstan                
                               # E2.0   [1] (🇰🇬)
+1F1F0 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: Cambodia                  
                               # E2.0   [1] (🇰🇭)
+1F1F0 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Kiribati                  
                               # E2.0   [1] (🇰🇮)
+1F1F0 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Comoros                   
                               # E2.0   [1] (🇰🇲)
+1F1F0 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: St. Kitts & Nevis         
                               # E2.0   [1] (🇰🇳)
+1F1F0 1F1F5   ; RGI_Emoji_Flag_Sequence      ; flag: North Korea               
                               # E2.0   [1] (🇰🇵)
+1F1F0 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: South Korea               
                               # E0.6   [1] (🇰🇷)
+1F1F0 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Kuwait                    
                               # E2.0   [1] (🇰🇼)
+1F1F0 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Cayman Islands            
                               # E2.0   [1] (🇰🇾)
+1F1F0 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Kazakhstan                
                               # E2.0   [1] (🇰🇿)
+1F1F1 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Laos                      
                               # E2.0   [1] (🇱🇦)
+1F1F1 1F1E7   ; RGI_Emoji_Flag_Sequence      ; flag: Lebanon                   
                               # E2.0   [1] (🇱🇧)
+1F1F1 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: St. Lucia                 
                               # E2.0   [1] (🇱🇨)
+1F1F1 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Liechtenstein             
                               # E2.0   [1] (🇱🇮)
+1F1F1 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Sri Lanka                 
                               # E2.0   [1] (🇱🇰)
+1F1F1 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Liberia                   
                               # E2.0   [1] (🇱🇷)
+1F1F1 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: Lesotho                   
                               # E2.0   [1] (🇱🇸)
+1F1F1 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Lithuania                 
                               # E2.0   [1] (🇱🇹)
+1F1F1 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Luxembourg                
                               # E2.0   [1] (🇱🇺)
+1F1F1 1F1FB   ; RGI_Emoji_Flag_Sequence      ; flag: Latvia                    
                               # E2.0   [1] (🇱🇻)
+1F1F1 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Libya                     
                               # E2.0   [1] (🇱🇾)
+1F1F2 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Morocco                   
                               # E2.0   [1] (🇲🇦)
+1F1F2 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: Monaco                    
                               # E2.0   [1] (🇲🇨)
+1F1F2 1F1E9   ; RGI_Emoji_Flag_Sequence      ; flag: Moldova                   
                               # E2.0   [1] (🇲🇩)
+1F1F2 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Montenegro                
                               # E2.0   [1] (🇲🇪)
+1F1F2 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: St. Martin                
                               # E2.0   [1] (🇲🇫)
+1F1F2 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Madagascar                
                               # E2.0   [1] (🇲🇬)
+1F1F2 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: Marshall Islands          
                               # E2.0   [1] (🇲🇭)
+1F1F2 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: North Macedonia           
                               # E2.0   [1] (🇲🇰)
+1F1F2 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Mali                      
                               # E2.0   [1] (🇲🇱)
+1F1F2 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Myanmar (Burma)           
                               # E2.0   [1] (🇲🇲)
+1F1F2 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: Mongolia                  
                               # E2.0   [1] (🇲🇳)
+1F1F2 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Macao SAR China           
                               # E2.0   [1] (🇲🇴)
+1F1F2 1F1F5   ; RGI_Emoji_Flag_Sequence      ; flag: Northern Mariana Islands  
                               # E2.0   [1] (🇲🇵)
+1F1F2 1F1F6   ; RGI_Emoji_Flag_Sequence      ; flag: Martinique                
                               # E2.0   [1] (🇲🇶)
+1F1F2 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Mauritania                
                               # E2.0   [1] (🇲🇷)
+1F1F2 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: Montserrat                
                               # E2.0   [1] (🇲🇸)
+1F1F2 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Malta                     
                               # E2.0   [1] (🇲🇹)
+1F1F2 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Mauritius                 
                               # E2.0   [1] (🇲🇺)
+1F1F2 1F1FB   ; RGI_Emoji_Flag_Sequence      ; flag: Maldives                  
                               # E2.0   [1] (🇲🇻)
+1F1F2 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Malawi                    
                               # E2.0   [1] (🇲🇼)
+1F1F2 1F1FD   ; RGI_Emoji_Flag_Sequence      ; flag: Mexico                    
                               # E2.0   [1] (🇲🇽)
+1F1F2 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Malaysia                  
                               # E2.0   [1] (🇲🇾)
+1F1F2 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Mozambique                
                               # E2.0   [1] (🇲🇿)
+1F1F3 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Namibia                   
                               # E2.0   [1] (🇳🇦)
+1F1F3 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: New Caledonia             
                               # E2.0   [1] (🇳🇨)
+1F1F3 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Niger                     
                               # E2.0   [1] (🇳🇪)
+1F1F3 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: Norfolk Island            
                               # E2.0   [1] (🇳🇫)
+1F1F3 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Nigeria                   
                               # E2.0   [1] (🇳🇬)
+1F1F3 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Nicaragua                 
                               # E2.0   [1] (🇳🇮)
+1F1F3 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Netherlands               
                               # E2.0   [1] (🇳🇱)
+1F1F3 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Norway                    
                               # E2.0   [1] (🇳🇴)
+1F1F3 1F1F5   ; RGI_Emoji_Flag_Sequence      ; flag: Nepal                     
                               # E2.0   [1] (🇳🇵)
+1F1F3 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Nauru                     
                               # E2.0   [1] (🇳🇷)
+1F1F3 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Niue                      
                               # E2.0   [1] (🇳🇺)
+1F1F3 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: New Zealand               
                               # E2.0   [1] (🇳🇿)
+1F1F4 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Oman                      
                               # E2.0   [1] (🇴🇲)
+1F1F5 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Panama                    
                               # E2.0   [1] (🇵🇦)
+1F1F5 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Peru                      
                               # E2.0   [1] (🇵🇪)
+1F1F5 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: French Polynesia          
                               # E2.0   [1] (🇵🇫)
+1F1F5 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Papua New Guinea          
                               # E2.0   [1] (🇵🇬)
+1F1F5 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: Philippines               
                               # E2.0   [1] (🇵🇭)
+1F1F5 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Pakistan                  
                               # E2.0   [1] (🇵🇰)
+1F1F5 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Poland                    
                               # E2.0   [1] (🇵🇱)
+1F1F5 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: St. Pierre & Miquelon     
                               # E2.0   [1] (🇵🇲)
+1F1F5 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: Pitcairn Islands          
                               # E2.0   [1] (🇵🇳)
+1F1F5 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Puerto Rico               
                               # E2.0   [1] (🇵🇷)
+1F1F5 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: Palestinian Territories   
                               # E2.0   [1] (🇵🇸)
+1F1F5 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Portugal                  
                               # E2.0   [1] (🇵🇹)
+1F1F5 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Palau                     
                               # E2.0   [1] (🇵🇼)
+1F1F5 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Paraguay                  
                               # E2.0   [1] (🇵🇾)
+1F1F6 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Qatar                     
                               # E2.0   [1] (🇶🇦)
+1F1F7 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Réunion                   
                               # E2.0   [1] (🇷🇪)
+1F1F7 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Romania                   
                               # E2.0   [1] (🇷🇴)
+1F1F7 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: Serbia                    
                               # E2.0   [1] (🇷🇸)
+1F1F7 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Russia                    
                               # E0.6   [1] (🇷🇺)
+1F1F7 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Rwanda                    
                               # E2.0   [1] (🇷🇼)
+1F1F8 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Saudi Arabia              
                               # E2.0   [1] (🇸🇦)
+1F1F8 1F1E7   ; RGI_Emoji_Flag_Sequence      ; flag: Solomon Islands           
                               # E2.0   [1] (🇸🇧)
+1F1F8 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: Seychelles                
                               # E2.0   [1] (🇸🇨)
+1F1F8 1F1E9   ; RGI_Emoji_Flag_Sequence      ; flag: Sudan                     
                               # E2.0   [1] (🇸🇩)
+1F1F8 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Sweden                    
                               # E2.0   [1] (🇸🇪)
+1F1F8 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Singapore                 
                               # E2.0   [1] (🇸🇬)
+1F1F8 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: St. Helena                
                               # E2.0   [1] (🇸🇭)
+1F1F8 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: Slovenia                  
                               # E2.0   [1] (🇸🇮)
+1F1F8 1F1EF   ; RGI_Emoji_Flag_Sequence      ; flag: Svalbard & Jan Mayen      
                               # E2.0   [1] (🇸🇯)
+1F1F8 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Slovakia                  
                               # E2.0   [1] (🇸🇰)
+1F1F8 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Sierra Leone              
                               # E2.0   [1] (🇸🇱)
+1F1F8 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: San Marino                
                               # E2.0   [1] (🇸🇲)
+1F1F8 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: Senegal                   
                               # E2.0   [1] (🇸🇳)
+1F1F8 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Somalia                   
                               # E2.0   [1] (🇸🇴)
+1F1F8 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Suriname                  
                               # E2.0   [1] (🇸🇷)
+1F1F8 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: South Sudan               
                               # E2.0   [1] (🇸🇸)
+1F1F8 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: São Tomé & Príncipe       
                               # E2.0   [1] (🇸🇹)
+1F1F8 1F1FB   ; RGI_Emoji_Flag_Sequence      ; flag: El Salvador               
                               # E2.0   [1] (🇸🇻)
+1F1F8 1F1FD   ; RGI_Emoji_Flag_Sequence      ; flag: Sint Maarten              
                               # E2.0   [1] (🇸🇽)
+1F1F8 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Syria                     
                               # E2.0   [1] (🇸🇾)
+1F1F8 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Eswatini                  
                               # E2.0   [1] (🇸🇿)
+1F1F9 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Tristan da Cunha          
                               # E2.0   [1] (🇹🇦)
+1F1F9 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: Turks & Caicos Islands    
                               # E2.0   [1] (🇹🇨)
+1F1F9 1F1E9   ; RGI_Emoji_Flag_Sequence      ; flag: Chad                      
                               # E2.0   [1] (🇹🇩)
+1F1F9 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: French Southern 
Territories                              # E2.0   [1] (🇹🇫)
+1F1F9 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Togo                      
                               # E2.0   [1] (🇹🇬)
+1F1F9 1F1ED   ; RGI_Emoji_Flag_Sequence      ; flag: Thailand                  
                               # E2.0   [1] (🇹🇭)
+1F1F9 1F1EF   ; RGI_Emoji_Flag_Sequence      ; flag: Tajikistan                
                               # E2.0   [1] (🇹🇯)
+1F1F9 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Tokelau                   
                               # E2.0   [1] (🇹🇰)
+1F1F9 1F1F1   ; RGI_Emoji_Flag_Sequence      ; flag: Timor-Leste               
                               # E2.0   [1] (🇹🇱)
+1F1F9 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Turkmenistan              
                               # E2.0   [1] (🇹🇲)
+1F1F9 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: Tunisia                   
                               # E2.0   [1] (🇹🇳)
+1F1F9 1F1F4   ; RGI_Emoji_Flag_Sequence      ; flag: Tonga                     
                               # E2.0   [1] (🇹🇴)
+1F1F9 1F1F7   ; RGI_Emoji_Flag_Sequence      ; flag: Turkey                    
                               # E2.0   [1] (🇹🇷)
+1F1F9 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Trinidad & Tobago         
                               # E2.0   [1] (🇹🇹)
+1F1F9 1F1FB   ; RGI_Emoji_Flag_Sequence      ; flag: Tuvalu                    
                               # E2.0   [1] (🇹🇻)
+1F1F9 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Taiwan                    
                               # E2.0   [1] (🇹🇼)
+1F1F9 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Tanzania                  
                               # E2.0   [1] (🇹🇿)
+1F1FA 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Ukraine                   
                               # E2.0   [1] (🇺🇦)
+1F1FA 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: Uganda                    
                               # E2.0   [1] (🇺🇬)
+1F1FA 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: U.S. Outlying Islands     
                               # E2.0   [1] (🇺🇲)
+1F1FA 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: United Nations            
                               # E4.0   [1] (🇺🇳)
+1F1FA 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: United States             
                               # E0.6   [1] (🇺🇸)
+1F1FA 1F1FE   ; RGI_Emoji_Flag_Sequence      ; flag: Uruguay                   
                               # E2.0   [1] (🇺🇾)
+1F1FA 1F1FF   ; RGI_Emoji_Flag_Sequence      ; flag: Uzbekistan                
                               # E2.0   [1] (🇺🇿)
+1F1FB 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: Vatican City              
                               # E2.0   [1] (🇻🇦)
+1F1FB 1F1E8   ; RGI_Emoji_Flag_Sequence      ; flag: St. Vincent & Grenadines  
                               # E2.0   [1] (🇻🇨)
+1F1FB 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Venezuela                 
                               # E2.0   [1] (🇻🇪)
+1F1FB 1F1EC   ; RGI_Emoji_Flag_Sequence      ; flag: British Virgin Islands    
                               # E2.0   [1] (🇻🇬)
+1F1FB 1F1EE   ; RGI_Emoji_Flag_Sequence      ; flag: U.S. Virgin Islands       
                               # E2.0   [1] (🇻🇮)
+1F1FB 1F1F3   ; RGI_Emoji_Flag_Sequence      ; flag: Vietnam                   
                               # E2.0   [1] (🇻🇳)
+1F1FB 1F1FA   ; RGI_Emoji_Flag_Sequence      ; flag: Vanuatu                   
                               # E2.0   [1] (🇻🇺)
+1F1FC 1F1EB   ; RGI_Emoji_Flag_Sequence      ; flag: Wallis & Futuna           
                               # E2.0   [1] (🇼🇫)
+1F1FC 1F1F8   ; RGI_Emoji_Flag_Sequence      ; flag: Samoa                     
                               # E2.0   [1] (🇼🇸)
+1F1FD 1F1F0   ; RGI_Emoji_Flag_Sequence      ; flag: Kosovo                    
                               # E2.0   [1] (🇽🇰)
+1F1FE 1F1EA   ; RGI_Emoji_Flag_Sequence      ; flag: Yemen                     
                               # E2.0   [1] (🇾🇪)
+1F1FE 1F1F9   ; RGI_Emoji_Flag_Sequence      ; flag: Mayotte                   
                               # E2.0   [1] (🇾🇹)
+1F1FF 1F1E6   ; RGI_Emoji_Flag_Sequence      ; flag: South Africa              
                               # E2.0   [1] (🇿🇦)
+1F1FF 1F1F2   ; RGI_Emoji_Flag_Sequence      ; flag: Zambia                    
                               # E2.0   [1] (🇿🇲)
+1F1FF 1F1FC   ; RGI_Emoji_Flag_Sequence      ; flag: Zimbabwe                  
                               # E2.0   [1] (🇿🇼)
+
+# Total elements: 258
+
+# ================================================
+
+# RGI_Emoji_Tag_Sequence: See Annex C of TR51 for more information.
+
+1F3F4 E0067 E0062 E0065 E006E E0067 E007F; RGI_Emoji_Tag_Sequence; flag: 
England                              # E5.0   [1] (🏴󠁧󠁢󠁥󠁮󠁧󠁿)
+1F3F4 E0067 E0062 E0073 E0063 E0074 E007F; RGI_Emoji_Tag_Sequence; flag: 
Scotland                             # E5.0   [1] (🏴󠁧󠁢󠁳󠁣󠁴󠁿)
+1F3F4 E0067 E0062 E0077 E006C E0073 E007F; RGI_Emoji_Tag_Sequence; flag: Wales 
                               # E5.0   [1] (🏴󠁧󠁢󠁷󠁬󠁳󠁿)
+
+# Total elements: 3
+
+# ================================================
+
+# RGI_Emoji_Modifier_Sequence
+
+261D 1F3FB    ; RGI_Emoji_Modifier_Sequence  ; index pointing up: light skin 
tone                             # E1.0   [1] (☝🏻)
+261D 1F3FC    ; RGI_Emoji_Modifier_Sequence  ; index pointing up: medium-light 
skin tone                      # E1.0   [1] (☝🏼)
+261D 1F3FD    ; RGI_Emoji_Modifier_Sequence  ; index pointing up: medium skin 
tone                            # E1.0   [1] (☝🏽)
+261D 1F3FE    ; RGI_Emoji_Modifier_Sequence  ; index pointing up: medium-dark 
skin tone                       # E1.0   [1] (☝🏾)
+261D 1F3FF    ; RGI_Emoji_Modifier_Sequence  ; index pointing up: dark skin 
tone                              # E1.0   [1] (☝🏿)
+26F9 1F3FB    ; RGI_Emoji_Modifier_Sequence  ; person bouncing ball: light 
skin tone                          # E2.0   [1] (⛹🏻)
+26F9 1F3FC    ; RGI_Emoji_Modifier_Sequence  ; person bouncing ball: 
medium-light skin tone                   # E2.0   [1] (⛹🏼)
+26F9 1F3FD    ; RGI_Emoji_Modifier_Sequence  ; person bouncing ball: medium 
skin tone                         # E2.0   [1] (⛹🏽)
+26F9 1F3FE    ; RGI_Emoji_Modifier_Sequence  ; person bouncing ball: 
medium-dark skin tone                    # E2.0   [1] (⛹🏾)
+26F9 1F3FF    ; RGI_Emoji_Modifier_Sequence  ; person bouncing ball: dark skin 
tone                           # E2.0   [1] (⛹🏿)
+270A 1F3FB    ; RGI_Emoji_Modifier_Sequence  ; raised fist: light skin tone    
                               # E1.0   [1] (✊🏻)
+270A 1F3FC    ; RGI_Emoji_Modifier_Sequence  ; raised fist: medium-light skin 
tone                            # E1.0   [1] (✊🏼)
+270A 1F3FD    ; RGI_Emoji_Modifier_Sequence  ; raised fist: medium skin tone   
                               # E1.0   [1] (✊🏽)
+270A 1F3FE    ; RGI_Emoji_Modifier_Sequence  ; raised fist: medium-dark skin 
tone                             # E1.0   [1] (✊🏾)
+270A 1F3FF    ; RGI_Emoji_Modifier_Sequence  ; raised fist: dark skin tone     
                               # E1.0   [1] (✊🏿)
+270B 1F3FB    ; RGI_Emoji_Modifier_Sequence  ; raised hand: light skin tone    
                               # E1.0   [1] (✋🏻)
+270B 1F3FC    ; RGI_Emoji_Modifier_Sequence  ; raised hand: medium-light skin 
tone                            # E1.0   [1] (✋🏼)
+270B 1F3FD    ; RGI_Emoji_Modifier_Sequence  ; raised hand: medium skin tone   
                               # E1.0   [1] (✋🏽)
+270B 1F3FE    ; RGI_Emoji_Modifier_Sequence  ; raised hand: medium-dark skin 
tone                             # E1.0   [1] (✋🏾)
+270B 1F3FF    ; RGI_Emoji_Modifier_Sequence  ; raised hand: dark skin tone     
                               # E1.0   [1] (✋🏿)
+270C 1F3FB    ; RGI_Emoji_Modifier_Sequence  ; victory hand: light skin tone   
                               # E1.0   [1] (✌🏻)
+270C 1F3FC    ; RGI_Emoji_Modifier_Sequence  ; victory hand: medium-light skin 
tone                           # E1.0   [1] (✌🏼)
+270C 1F3FD    ; RGI_Emoji_Modifier_Sequence  ; victory hand: medium skin tone  
                               # E1.0   [1] (✌🏽)
+270C 1F3FE    ; RGI_Emoji_Modifier_Sequence  ; victory hand: medium-dark skin 
tone                            # E1.0   [1] (✌🏾)
+270C 1F3FF    ; RGI_Emoji_Modifier_Sequence  ; victory hand: dark skin tone    
                               # E1.0   [1] (✌🏿)
+270D 1F3FB    ; RGI_Emoji_Modifier_Sequence  ; writing hand: light skin tone   
                               # E1.0   [1] (✍🏻)
+270D 1F3FC    ; RGI_Emoji_Modifier_Sequence  ; writing hand: medium-light skin 
tone                           # E1.0   [1] (✍🏼)
+270D 1F3FD    ; RGI_Emoji_Modifier_Sequence  ; writing hand: medium skin tone  
                               # E1.0   [1] (✍🏽)
+270D 1F3FE    ; RGI_Emoji_Modifier_Sequence  ; writing hand: medium-dark skin 
tone                            # E1.0   [1] (✍🏾)
+270D 1F3FF    ; RGI_Emoji_Modifier_Sequence  ; writing hand: dark skin tone    
                               # E1.0   [1] (✍🏿)
+1F385 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; Santa Claus: light skin tone    
                               # E1.0   [1] (🎅🏻)
+1F385 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; Santa Claus: medium-light skin 
tone                            # E1.0   [1] (🎅🏼)
+1F385 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; Santa Claus: medium skin tone   
                               # E1.0   [1] (🎅🏽)
+1F385 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; Santa Claus: medium-dark skin 
tone                             # E1.0   [1] (🎅🏾)
+1F385 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; Santa Claus: dark skin tone     
                               # E1.0   [1] (🎅🏿)
+1F3C2 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; snowboarder: light skin tone    
                               # E1.0   [1] (🏂🏻)
+1F3C2 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; snowboarder: medium-light skin 
tone                            # E1.0   [1] (🏂🏼)
+1F3C2 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; snowboarder: medium skin tone   
                               # E1.0   [1] (🏂🏽)
+1F3C2 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; snowboarder: medium-dark skin 
tone                             # E1.0   [1] (🏂🏾)
+1F3C2 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; snowboarder: dark skin tone     
                               # E1.0   [1] (🏂🏿)
+1F3C3 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person running: light skin tone 
                               # E1.0   [1] (🏃🏻)
+1F3C3 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person running: medium-light 
skin tone                         # E1.0   [1] (🏃🏼)
+1F3C3 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person running: medium skin 
tone                               # E1.0   [1] (🏃🏽)
+1F3C3 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person running: medium-dark 
skin tone                          # E1.0   [1] (🏃🏾)
+1F3C3 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person running: dark skin tone  
                               # E1.0   [1] (🏃🏿)
+1F3C4 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person surfing: light skin tone 
                               # E1.0   [1] (🏄🏻)
+1F3C4 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person surfing: medium-light 
skin tone                         # E1.0   [1] (🏄🏼)
+1F3C4 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person surfing: medium skin 
tone                               # E1.0   [1] (🏄🏽)
+1F3C4 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person surfing: medium-dark 
skin tone                          # E1.0   [1] (🏄🏾)
+1F3C4 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person surfing: dark skin tone  
                               # E1.0   [1] (🏄🏿)
+1F3C7 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; horse racing: light skin tone   
                               # E1.0   [1] (🏇🏻)
+1F3C7 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; horse racing: medium-light skin 
tone                           # E1.0   [1] (🏇🏼)
+1F3C7 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; horse racing: medium skin tone  
                               # E1.0   [1] (🏇🏽)
+1F3C7 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; horse racing: medium-dark skin 
tone                            # E1.0   [1] (🏇🏾)
+1F3C7 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; horse racing: dark skin tone    
                               # E1.0   [1] (🏇🏿)
+1F3CA 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person swimming: light skin 
tone                               # E1.0   [1] (🏊🏻)
+1F3CA 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person swimming: medium-light 
skin tone                        # E1.0   [1] (🏊🏼)
+1F3CA 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person swimming: medium skin 
tone                              # E1.0   [1] (🏊🏽)
+1F3CA 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person swimming: medium-dark 
skin tone                         # E1.0   [1] (🏊🏾)
+1F3CA 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person swimming: dark skin tone 
                               # E1.0   [1] (🏊🏿)
+1F3CB 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person lifting weights: light 
skin tone                        # E2.0   [1] (🏋🏻)
+1F3CB 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person lifting weights: 
medium-light skin tone                 # E2.0   [1] (🏋🏼)
+1F3CB 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person lifting weights: medium 
skin tone                       # E2.0   [1] (🏋🏽)
+1F3CB 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person lifting weights: 
medium-dark skin tone                  # E2.0   [1] (🏋🏾)
+1F3CB 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person lifting weights: dark 
skin tone                         # E2.0   [1] (🏋🏿)
+1F3CC 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person golfing: light skin tone 
                               # E4.0   [1] (🏌🏻)
+1F3CC 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person golfing: medium-light 
skin tone                         # E4.0   [1] (🏌🏼)
+1F3CC 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person golfing: medium skin 
tone                               # E4.0   [1] (🏌🏽)
+1F3CC 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person golfing: medium-dark 
skin tone                          # E4.0   [1] (🏌🏾)
+1F3CC 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person golfing: dark skin tone  
                               # E4.0   [1] (🏌🏿)
+1F442 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; ear: light skin tone            
                               # E1.0   [1] (👂🏻)
+1F442 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; ear: medium-light skin tone     
                               # E1.0   [1] (👂🏼)
+1F442 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; ear: medium skin tone           
                               # E1.0   [1] (👂🏽)
+1F442 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; ear: medium-dark skin tone      
                               # E1.0   [1] (👂🏾)
+1F442 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; ear: dark skin tone             
                               # E1.0   [1] (👂🏿)
+1F443 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; nose: light skin tone           
                               # E1.0   [1] (👃🏻)
+1F443 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; nose: medium-light skin tone    
                               # E1.0   [1] (👃🏼)
+1F443 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; nose: medium skin tone          
                               # E1.0   [1] (👃🏽)
+1F443 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; nose: medium-dark skin tone     
                               # E1.0   [1] (👃🏾)
+1F443 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; nose: dark skin tone            
                               # E1.0   [1] (👃🏿)
+1F446 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing up: 
light skin tone                    # E1.0   [1] (👆🏻)
+1F446 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing up: 
medium-light skin tone             # E1.0   [1] (👆🏼)
+1F446 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing up: 
medium skin tone                   # E1.0   [1] (👆🏽)
+1F446 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing up: 
medium-dark skin tone              # E1.0   [1] (👆🏾)
+1F446 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing up: 
dark skin tone                     # E1.0   [1] (👆🏿)
+1F447 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing down: 
light skin tone                  # E1.0   [1] (👇🏻)
+1F447 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing down: 
medium-light skin tone           # E1.0   [1] (👇🏼)
+1F447 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing down: 
medium skin tone                 # E1.0   [1] (👇🏽)
+1F447 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing down: 
medium-dark skin tone            # E1.0   [1] (👇🏾)
+1F447 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing down: 
dark skin tone                   # E1.0   [1] (👇🏿)
+1F448 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing left: 
light skin tone                  # E1.0   [1] (👈🏻)
+1F448 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing left: 
medium-light skin tone           # E1.0   [1] (👈🏼)
+1F448 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing left: 
medium skin tone                 # E1.0   [1] (👈🏽)
+1F448 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing left: 
medium-dark skin tone            # E1.0   [1] (👈🏾)
+1F448 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing left: 
dark skin tone                   # E1.0   [1] (👈🏿)
+1F449 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing right: 
light skin tone                 # E1.0   [1] (👉🏻)
+1F449 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing right: 
medium-light skin tone          # E1.0   [1] (👉🏼)
+1F449 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing right: 
medium skin tone                # E1.0   [1] (👉🏽)
+1F449 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing right: 
medium-dark skin tone           # E1.0   [1] (👉🏾)
+1F449 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; backhand index pointing right: 
dark skin tone                  # E1.0   [1] (👉🏿)
+1F44A 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; oncoming fist: light skin tone  
                               # E1.0   [1] (👊🏻)
+1F44A 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; oncoming fist: medium-light 
skin tone                          # E1.0   [1] (👊🏼)
+1F44A 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; oncoming fist: medium skin tone 
                               # E1.0   [1] (👊🏽)
+1F44A 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; oncoming fist: medium-dark skin 
tone                           # E1.0   [1] (👊🏾)
+1F44A 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; oncoming fist: dark skin tone   
                               # E1.0   [1] (👊🏿)
+1F44B 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; waving hand: light skin tone    
                               # E1.0   [1] (👋🏻)
+1F44B 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; waving hand: medium-light skin 
tone                            # E1.0   [1] (👋🏼)
+1F44B 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; waving hand: medium skin tone   
                               # E1.0   [1] (👋🏽)
+1F44B 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; waving hand: medium-dark skin 
tone                             # E1.0   [1] (👋🏾)
+1F44B 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; waving hand: dark skin tone     
                               # E1.0   [1] (👋🏿)
+1F44C 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; OK hand: light skin tone        
                               # E1.0   [1] (👌🏻)
+1F44C 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; OK hand: medium-light skin tone 
                               # E1.0   [1] (👌🏼)
+1F44C 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; OK hand: medium skin tone       
                               # E1.0   [1] (👌🏽)
+1F44C 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; OK hand: medium-dark skin tone  
                               # E1.0   [1] (👌🏾)
+1F44C 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; OK hand: dark skin tone         
                               # E1.0   [1] (👌🏿)
+1F44D 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; thumbs up: light skin tone      
                               # E1.0   [1] (👍🏻)
+1F44D 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; thumbs up: medium-light skin 
tone                              # E1.0   [1] (👍🏼)
+1F44D 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; thumbs up: medium skin tone     
                               # E1.0   [1] (👍🏽)
+1F44D 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; thumbs up: medium-dark skin 
tone                               # E1.0   [1] (👍🏾)
+1F44D 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; thumbs up: dark skin tone       
                               # E1.0   [1] (👍🏿)
+1F44E 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; thumbs down: light skin tone    
                               # E1.0   [1] (👎🏻)
+1F44E 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; thumbs down: medium-light skin 
tone                            # E1.0   [1] (👎🏼)
+1F44E 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; thumbs down: medium skin tone   
                               # E1.0   [1] (👎🏽)
+1F44E 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; thumbs down: medium-dark skin 
tone                             # E1.0   [1] (👎🏾)
+1F44E 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; thumbs down: dark skin tone     
                               # E1.0   [1] (👎🏿)
+1F44F 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; clapping hands: light skin tone 
                               # E1.0   [1] (👏🏻)
+1F44F 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; clapping hands: medium-light 
skin tone                         # E1.0   [1] (👏🏼)
+1F44F 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; clapping hands: medium skin 
tone                               # E1.0   [1] (👏🏽)
+1F44F 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; clapping hands: medium-dark 
skin tone                          # E1.0   [1] (👏🏾)
+1F44F 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; clapping hands: dark skin tone  
                               # E1.0   [1] (👏🏿)
+1F450 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; open hands: light skin tone     
                               # E1.0   [1] (👐🏻)
+1F450 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; open hands: medium-light skin 
tone                             # E1.0   [1] (👐🏼)
+1F450 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; open hands: medium skin tone    
                               # E1.0   [1] (👐🏽)
+1F450 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; open hands: medium-dark skin 
tone                              # E1.0   [1] (👐🏾)
+1F450 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; open hands: dark skin tone      
                               # E1.0   [1] (👐🏿)
+1F466 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; boy: light skin tone            
                               # E1.0   [1] (👦🏻)
+1F466 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; boy: medium-light skin tone     
                               # E1.0   [1] (👦🏼)
+1F466 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; boy: medium skin tone           
                               # E1.0   [1] (👦🏽)
+1F466 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; boy: medium-dark skin tone      
                               # E1.0   [1] (👦🏾)
+1F466 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; boy: dark skin tone             
                               # E1.0   [1] (👦🏿)
+1F467 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; girl: light skin tone           
                               # E1.0   [1] (👧🏻)
+1F467 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; girl: medium-light skin tone    
                               # E1.0   [1] (👧🏼)
+1F467 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; girl: medium skin tone          
                               # E1.0   [1] (👧🏽)
+1F467 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; girl: medium-dark skin tone     
                               # E1.0   [1] (👧🏾)
+1F467 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; girl: dark skin tone            
                               # E1.0   [1] (👧🏿)
+1F468 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; man: light skin tone            
                               # E1.0   [1] (👨🏻)
+1F468 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; man: medium-light skin tone     
                               # E1.0   [1] (👨🏼)
+1F468 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; man: medium skin tone           
                               # E1.0   [1] (👨🏽)
+1F468 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; man: medium-dark skin tone      
                               # E1.0   [1] (👨🏾)
+1F468 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; man: dark skin tone             
                               # E1.0   [1] (👨🏿)
+1F469 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; woman: light skin tone          
                               # E1.0   [1] (👩🏻)
+1F469 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; woman: medium-light skin tone   
                               # E1.0   [1] (👩🏼)
+1F469 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; woman: medium skin tone         
                               # E1.0   [1] (👩🏽)
+1F469 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; woman: medium-dark skin tone    
                               # E1.0   [1] (👩🏾)
+1F469 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; woman: dark skin tone           
                               # E1.0   [1] (👩🏿)
+1F46B 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; woman and man holding hands: 
light skin tone                   # E12.0  [1] (👫🏻)
+1F46B 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; woman and man holding hands: 
medium-light skin tone            # E12.0  [1] (👫🏼)
+1F46B 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; woman and man holding hands: 
medium skin tone                  # E12.0  [1] (👫🏽)
+1F46B 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; woman and man holding hands: 
medium-dark skin tone             # E12.0  [1] (👫🏾)
+1F46B 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; woman and man holding hands: 
dark skin tone                    # E12.0  [1] (👫🏿)
+1F46C 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; men holding hands: light skin 
tone                             # E12.0  [1] (👬🏻)
+1F46C 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; men holding hands: medium-light 
skin tone                      # E12.0  [1] (👬🏼)
+1F46C 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; men holding hands: medium skin 
tone                            # E12.0  [1] (👬🏽)
+1F46C 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; men holding hands: medium-dark 
skin tone                       # E12.0  [1] (👬🏾)
+1F46C 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; men holding hands: dark skin 
tone                              # E12.0  [1] (👬🏿)
+1F46D 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; women holding hands: light skin 
tone                           # E12.0  [1] (👭🏻)
+1F46D 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; women holding hands: 
medium-light skin tone                    # E12.0  [1] (👭🏼)
+1F46D 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; women holding hands: medium 
skin tone                          # E12.0  [1] (👭🏽)
+1F46D 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; women holding hands: 
medium-dark skin tone                     # E12.0  [1] (👭🏾)
+1F46D 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; women holding hands: dark skin 
tone                            # E12.0  [1] (👭🏿)
+1F46E 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; police officer: light skin tone 
                               # E1.0   [1] (👮🏻)
+1F46E 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; police officer: medium-light 
skin tone                         # E1.0   [1] (👮🏼)
+1F46E 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; police officer: medium skin 
tone                               # E1.0   [1] (👮🏽)
+1F46E 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; police officer: medium-dark 
skin tone                          # E1.0   [1] (👮🏾)
+1F46E 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; police officer: dark skin tone  
                               # E1.0   [1] (👮🏿)
+1F470 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person with veil: light skin 
tone                              # E1.0   [1] (👰🏻)
+1F470 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person with veil: medium-light 
skin tone                       # E1.0   [1] (👰🏼)
+1F470 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person with veil: medium skin 
tone                             # E1.0   [1] (👰🏽)
+1F470 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person with veil: medium-dark 
skin tone                        # E1.0   [1] (👰🏾)
+1F470 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person with veil: dark skin 
tone                               # E1.0   [1] (👰🏿)
+1F471 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person: light skin tone, blond 
hair                            # E1.0   [1] (👱🏻)
+1F471 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person: medium-light skin tone, 
blond hair                     # E1.0   [1] (👱🏼)
+1F471 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person: medium skin tone, blond 
hair                           # E1.0   [1] (👱🏽)
+1F471 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person: medium-dark skin tone, 
blond hair                      # E1.0   [1] (👱🏾)
+1F471 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person: dark skin tone, blond 
hair                             # E1.0   [1] (👱🏿)
+1F472 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person with skullcap: light 
skin tone                          # E1.0   [1] (👲🏻)
+1F472 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person with skullcap: 
medium-light skin tone                   # E1.0   [1] (👲🏼)
+1F472 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person with skullcap: medium 
skin tone                         # E1.0   [1] (👲🏽)
+1F472 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person with skullcap: 
medium-dark skin tone                    # E1.0   [1] (👲🏾)
+1F472 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person with skullcap: dark skin 
tone                           # E1.0   [1] (👲🏿)
+1F473 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person wearing turban: light 
skin tone                         # E1.0   [1] (👳🏻)
+1F473 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person wearing turban: 
medium-light skin tone                  # E1.0   [1] (👳🏼)
+1F473 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person wearing turban: medium 
skin tone                        # E1.0   [1] (👳🏽)
+1F473 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person wearing turban: 
medium-dark skin tone                   # E1.0   [1] (👳🏾)
+1F473 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person wearing turban: dark 
skin tone                          # E1.0   [1] (👳🏿)
+1F474 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; old man: light skin tone        
                               # E1.0   [1] (👴🏻)
+1F474 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; old man: medium-light skin tone 
                               # E1.0   [1] (👴🏼)
+1F474 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; old man: medium skin tone       
                               # E1.0   [1] (👴🏽)
+1F474 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; old man: medium-dark skin tone  
                               # E1.0   [1] (👴🏾)
+1F474 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; old man: dark skin tone         
                               # E1.0   [1] (👴🏿)
+1F475 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; old woman: light skin tone      
                               # E1.0   [1] (👵🏻)
+1F475 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; old woman: medium-light skin 
tone                              # E1.0   [1] (👵🏼)
+1F475 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; old woman: medium skin tone     
                               # E1.0   [1] (👵🏽)
+1F475 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; old woman: medium-dark skin 
tone                               # E1.0   [1] (👵🏾)
+1F475 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; old woman: dark skin tone       
                               # E1.0   [1] (👵🏿)
+1F476 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; baby: light skin tone           
                               # E1.0   [1] (👶🏻)
+1F476 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; baby: medium-light skin tone    
                               # E1.0   [1] (👶🏼)
+1F476 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; baby: medium skin tone          
                               # E1.0   [1] (👶🏽)
+1F476 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; baby: medium-dark skin tone     
                               # E1.0   [1] (👶🏾)
+1F476 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; baby: dark skin tone            
                               # E1.0   [1] (👶🏿)
+1F477 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; construction worker: light skin 
tone                           # E1.0   [1] (👷🏻)
+1F477 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; construction worker: 
medium-light skin tone                    # E1.0   [1] (👷🏼)
+1F477 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; construction worker: medium 
skin tone                          # E1.0   [1] (👷🏽)
+1F477 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; construction worker: 
medium-dark skin tone                     # E1.0   [1] (👷🏾)
+1F477 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; construction worker: dark skin 
tone                            # E1.0   [1] (👷🏿)
+1F478 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; princess: light skin tone       
                               # E1.0   [1] (👸🏻)
+1F478 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; princess: medium-light skin 
tone                               # E1.0   [1] (👸🏼)
+1F478 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; princess: medium skin tone      
                               # E1.0   [1] (👸🏽)
+1F478 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; princess: medium-dark skin tone 
                               # E1.0   [1] (👸🏾)
+1F478 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; princess: dark skin tone        
                               # E1.0   [1] (👸🏿)
+1F47C 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; baby angel: light skin tone     
                               # E1.0   [1] (👼🏻)
+1F47C 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; baby angel: medium-light skin 
tone                             # E1.0   [1] (👼🏼)
+1F47C 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; baby angel: medium skin tone    
                               # E1.0   [1] (👼🏽)
+1F47C 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; baby angel: medium-dark skin 
tone                              # E1.0   [1] (👼🏾)
+1F47C 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; baby angel: dark skin tone      
                               # E1.0   [1] (👼🏿)
+1F481 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person tipping hand: light skin 
tone                           # E1.0   [1] (💁🏻)
+1F481 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person tipping hand: 
medium-light skin tone                    # E1.0   [1] (💁🏼)
+1F481 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person tipping hand: medium 
skin tone                          # E1.0   [1] (💁🏽)
+1F481 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person tipping hand: 
medium-dark skin tone                     # E1.0   [1] (💁🏾)
+1F481 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person tipping hand: dark skin 
tone                            # E1.0   [1] (💁🏿)
+1F482 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; guard: light skin tone          
                               # E1.0   [1] (💂🏻)
+1F482 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; guard: medium-light skin tone   
                               # E1.0   [1] (💂🏼)
+1F482 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; guard: medium skin tone         
                               # E1.0   [1] (💂🏽)
+1F482 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; guard: medium-dark skin tone    
                               # E1.0   [1] (💂🏾)
+1F482 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; guard: dark skin tone           
                               # E1.0   [1] (💂🏿)
+1F483 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; woman dancing: light skin tone  
                               # E1.0   [1] (💃🏻)
+1F483 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; woman dancing: medium-light 
skin tone                          # E1.0   [1] (💃🏼)
+1F483 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; woman dancing: medium skin tone 
                               # E1.0   [1] (💃🏽)
+1F483 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; woman dancing: medium-dark skin 
tone                           # E1.0   [1] (💃🏾)
+1F483 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; woman dancing: dark skin tone   
                               # E1.0   [1] (💃🏿)
+1F485 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; nail polish: light skin tone    
                               # E1.0   [1] (💅🏻)
+1F485 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; nail polish: medium-light skin 
tone                            # E1.0   [1] (💅🏼)
+1F485 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; nail polish: medium skin tone   
                               # E1.0   [1] (💅🏽)
+1F485 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; nail polish: medium-dark skin 
tone                             # E1.0   [1] (💅🏾)
+1F485 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; nail polish: dark skin tone     
                               # E1.0   [1] (💅🏿)
+1F486 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person getting massage: light 
skin tone                        # E1.0   [1] (💆🏻)
+1F486 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person getting massage: 
medium-light skin tone                 # E1.0   [1] (💆🏼)
+1F486 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person getting massage: medium 
skin tone                       # E1.0   [1] (💆🏽)
+1F486 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person getting massage: 
medium-dark skin tone                  # E1.0   [1] (💆🏾)
+1F486 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person getting massage: dark 
skin tone                         # E1.0   [1] (💆🏿)
+1F487 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person getting haircut: light 
skin tone                        # E1.0   [1] (💇🏻)
+1F487 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person getting haircut: 
medium-light skin tone                 # E1.0   [1] (💇🏼)
+1F487 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person getting haircut: medium 
skin tone                       # E1.0   [1] (💇🏽)
+1F487 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person getting haircut: 
medium-dark skin tone                  # E1.0   [1] (💇🏾)
+1F487 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person getting haircut: dark 
skin tone                         # E1.0   [1] (💇🏿)
+1F48F 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; kiss: light skin tone           
                               # E13.1  [1] (💏🏻)
+1F48F 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; kiss: medium-light skin tone    
                               # E13.1  [1] (💏🏼)
+1F48F 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; kiss: medium skin tone          
                               # E13.1  [1] (💏🏽)
+1F48F 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; kiss: medium-dark skin tone     
                               # E13.1  [1] (💏🏾)
+1F48F 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; kiss: dark skin tone            
                               # E13.1  [1] (💏🏿)
+1F491 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; couple with heart: light skin 
tone                             # E13.1  [1] (💑🏻)
+1F491 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; couple with heart: medium-light 
skin tone                      # E13.1  [1] (💑🏼)
+1F491 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; couple with heart: medium skin 
tone                            # E13.1  [1] (💑🏽)
+1F491 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; couple with heart: medium-dark 
skin tone                       # E13.1  [1] (💑🏾)
+1F491 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; couple with heart: dark skin 
tone                              # E13.1  [1] (💑🏿)
+1F4AA 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; flexed biceps: light skin tone  
                               # E1.0   [1] (💪🏻)
+1F4AA 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; flexed biceps: medium-light 
skin tone                          # E1.0   [1] (💪🏼)
+1F4AA 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; flexed biceps: medium skin tone 
                               # E1.0   [1] (💪🏽)
+1F4AA 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; flexed biceps: medium-dark skin 
tone                           # E1.0   [1] (💪🏾)
+1F4AA 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; flexed biceps: dark skin tone   
                               # E1.0   [1] (💪🏿)
+1F574 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person in suit levitating: 
light skin tone                     # E4.0   [1] (🕴🏻)
+1F574 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person in suit levitating: 
medium-light skin tone              # E4.0   [1] (🕴🏼)
+1F574 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person in suit levitating: 
medium skin tone                    # E4.0   [1] (🕴🏽)
+1F574 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person in suit levitating: 
medium-dark skin tone               # E4.0   [1] (🕴🏾)
+1F574 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person in suit levitating: dark 
skin tone                      # E4.0   [1] (🕴🏿)
+1F575 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; detective: light skin tone      
                               # E2.0   [1] (🕵🏻)
+1F575 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; detective: medium-light skin 
tone                              # E2.0   [1] (🕵🏼)
+1F575 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; detective: medium skin tone     
                               # E2.0   [1] (🕵🏽)
+1F575 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; detective: medium-dark skin 
tone                               # E2.0   [1] (🕵🏾)
+1F575 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; detective: dark skin tone       
                               # E2.0   [1] (🕵🏿)
+1F57A 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; man dancing: light skin tone    
                               # E3.0   [1] (🕺🏻)
+1F57A 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; man dancing: medium-light skin 
tone                            # E3.0   [1] (🕺🏼)
+1F57A 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; man dancing: medium skin tone   
                               # E3.0   [1] (🕺🏽)
+1F57A 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; man dancing: medium-dark skin 
tone                             # E3.0   [1] (🕺🏾)
+1F57A 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; man dancing: dark skin tone     
                               # E3.0   [1] (🕺🏿)
+1F590 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; hand with fingers splayed: 
light skin tone                     # E1.0   [1] (🖐🏻)
+1F590 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; hand with fingers splayed: 
medium-light skin tone              # E1.0   [1] (🖐🏼)
+1F590 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; hand with fingers splayed: 
medium skin tone                    # E1.0   [1] (🖐🏽)
+1F590 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; hand with fingers splayed: 
medium-dark skin tone               # E1.0   [1] (🖐🏾)
+1F590 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; hand with fingers splayed: dark 
skin tone                      # E1.0   [1] (🖐🏿)
+1F595 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; middle finger: light skin tone  
                               # E1.0   [1] (🖕🏻)
+1F595 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; middle finger: medium-light 
skin tone                          # E1.0   [1] (🖕🏼)
+1F595 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; middle finger: medium skin tone 
                               # E1.0   [1] (🖕🏽)
+1F595 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; middle finger: medium-dark skin 
tone                           # E1.0   [1] (🖕🏾)
+1F595 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; middle finger: dark skin tone   
                               # E1.0   [1] (🖕🏿)
+1F596 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; vulcan salute: light skin tone  
                               # E1.0   [1] (🖖🏻)
+1F596 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; vulcan salute: medium-light 
skin tone                          # E1.0   [1] (🖖🏼)
+1F596 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; vulcan salute: medium skin tone 
                               # E1.0   [1] (🖖🏽)
+1F596 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; vulcan salute: medium-dark skin 
tone                           # E1.0   [1] (🖖🏾)
+1F596 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; vulcan salute: dark skin tone   
                               # E1.0   [1] (🖖🏿)
+1F645 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person gesturing NO: light skin 
tone                           # E1.0   [1] (🙅🏻)
+1F645 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person gesturing NO: 
medium-light skin tone                    # E1.0   [1] (🙅🏼)
+1F645 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person gesturing NO: medium 
skin tone                          # E1.0   [1] (🙅🏽)
+1F645 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person gesturing NO: 
medium-dark skin tone                     # E1.0   [1] (🙅🏾)
+1F645 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person gesturing NO: dark skin 
tone                            # E1.0   [1] (🙅🏿)
+1F646 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person gesturing OK: light skin 
tone                           # E1.0   [1] (🙆🏻)
+1F646 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person gesturing OK: 
medium-light skin tone                    # E1.0   [1] (🙆🏼)
+1F646 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person gesturing OK: medium 
skin tone                          # E1.0   [1] (🙆🏽)
+1F646 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person gesturing OK: 
medium-dark skin tone                     # E1.0   [1] (🙆🏾)
+1F646 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person gesturing OK: dark skin 
tone                            # E1.0   [1] (🙆🏿)
+1F647 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person bowing: light skin tone  
                               # E1.0   [1] (🙇🏻)
+1F647 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person bowing: medium-light 
skin tone                          # E1.0   [1] (🙇🏼)
+1F647 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person bowing: medium skin tone 
                               # E1.0   [1] (🙇🏽)
+1F647 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person bowing: medium-dark skin 
tone                           # E1.0   [1] (🙇🏾)
+1F647 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person bowing: dark skin tone   
                               # E1.0   [1] (🙇🏿)
+1F64B 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person raising hand: light skin 
tone                           # E1.0   [1] (🙋🏻)
+1F64B 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person raising hand: 
medium-light skin tone                    # E1.0   [1] (🙋🏼)
+1F64B 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person raising hand: medium 
skin tone                          # E1.0   [1] (🙋🏽)
+1F64B 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person raising hand: 
medium-dark skin tone                     # E1.0   [1] (🙋🏾)
+1F64B 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person raising hand: dark skin 
tone                            # E1.0   [1] (🙋🏿)
+1F64C 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; raising hands: light skin tone  
                               # E1.0   [1] (🙌🏻)
+1F64C 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; raising hands: medium-light 
skin tone                          # E1.0   [1] (🙌🏼)
+1F64C 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; raising hands: medium skin tone 
                               # E1.0   [1] (🙌🏽)
+1F64C 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; raising hands: medium-dark skin 
tone                           # E1.0   [1] (🙌🏾)
+1F64C 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; raising hands: dark skin tone   
                               # E1.0   [1] (🙌🏿)
+1F64D 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person frowning: light skin 
tone                               # E1.0   [1] (🙍🏻)
+1F64D 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person frowning: medium-light 
skin tone                        # E1.0   [1] (🙍🏼)
+1F64D 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person frowning: medium skin 
tone                              # E1.0   [1] (🙍🏽)
+1F64D 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person frowning: medium-dark 
skin tone                         # E1.0   [1] (🙍🏾)
+1F64D 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person frowning: dark skin tone 
                               # E1.0   [1] (🙍🏿)
+1F64E 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person pouting: light skin tone 
                               # E1.0   [1] (🙎🏻)
+1F64E 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person pouting: medium-light 
skin tone                         # E1.0   [1] (🙎🏼)
+1F64E 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person pouting: medium skin 
tone                               # E1.0   [1] (🙎🏽)
+1F64E 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person pouting: medium-dark 
skin tone                          # E1.0   [1] (🙎🏾)
+1F64E 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person pouting: dark skin tone  
                               # E1.0   [1] (🙎🏿)
+1F64F 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; folded hands: light skin tone   
                               # E1.0   [1] (🙏🏻)
+1F64F 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; folded hands: medium-light skin 
tone                           # E1.0   [1] (🙏🏼)
+1F64F 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; folded hands: medium skin tone  
                               # E1.0   [1] (🙏🏽)
+1F64F 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; folded hands: medium-dark skin 
tone                            # E1.0   [1] (🙏🏾)
+1F64F 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; folded hands: dark skin tone    
                               # E1.0   [1] (🙏🏿)
+1F6A3 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person rowing boat: light skin 
tone                            # E1.0   [1] (🚣🏻)
+1F6A3 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person rowing boat: 
medium-light skin tone                     # E1.0   [1] (🚣🏼)
+1F6A3 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person rowing boat: medium skin 
tone                           # E1.0   [1] (🚣🏽)
+1F6A3 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person rowing boat: medium-dark 
skin tone                      # E1.0   [1] (🚣🏾)
+1F6A3 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person rowing boat: dark skin 
tone                             # E1.0   [1] (🚣🏿)
+1F6B4 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person biking: light skin tone  
                               # E1.0   [1] (🚴🏻)
+1F6B4 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person biking: medium-light 
skin tone                          # E1.0   [1] (🚴🏼)
+1F6B4 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person biking: medium skin tone 
                               # E1.0   [1] (🚴🏽)
+1F6B4 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person biking: medium-dark skin 
tone                           # E1.0   [1] (🚴🏾)
+1F6B4 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person biking: dark skin tone   
                               # E1.0   [1] (🚴🏿)
+1F6B5 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person mountain biking: light 
skin tone                        # E1.0   [1] (🚵🏻)
+1F6B5 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person mountain biking: 
medium-light skin tone                 # E1.0   [1] (🚵🏼)
+1F6B5 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person mountain biking: medium 
skin tone                       # E1.0   [1] (🚵🏽)
+1F6B5 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person mountain biking: 
medium-dark skin tone                  # E1.0   [1] (🚵🏾)
+1F6B5 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person mountain biking: dark 
skin tone                         # E1.0   [1] (🚵🏿)
+1F6B6 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person walking: light skin tone 
                               # E1.0   [1] (🚶🏻)
+1F6B6 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person walking: medium-light 
skin tone                         # E1.0   [1] (🚶🏼)
+1F6B6 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person walking: medium skin 
tone                               # E1.0   [1] (🚶🏽)
+1F6B6 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person walking: medium-dark 
skin tone                          # E1.0   [1] (🚶🏾)
+1F6B6 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person walking: dark skin tone  
                               # E1.0   [1] (🚶🏿)
+1F6C0 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person taking bath: light skin 
tone                            # E1.0   [1] (🛀🏻)
+1F6C0 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person taking bath: 
medium-light skin tone                     # E1.0   [1] (🛀🏼)
+1F6C0 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person taking bath: medium skin 
tone                           # E1.0   [1] (🛀🏽)
+1F6C0 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person taking bath: medium-dark 
skin tone                      # E1.0   [1] (🛀🏾)
+1F6C0 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person taking bath: dark skin 
tone                             # E1.0   [1] (🛀🏿)
+1F6CC 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person in bed: light skin tone  
                               # E4.0   [1] (🛌🏻)
+1F6CC 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person in bed: medium-light 
skin tone                          # E4.0   [1] (🛌🏼)
+1F6CC 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person in bed: medium skin tone 
                               # E4.0   [1] (🛌🏽)
+1F6CC 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person in bed: medium-dark skin 
tone                           # E4.0   [1] (🛌🏾)
+1F6CC 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person in bed: dark skin tone   
                               # E4.0   [1] (🛌🏿)
+1F90C 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; pinched fingers: light skin 
tone                               # E13.0  [1] (🤌🏻)
+1F90C 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; pinched fingers: medium-light 
skin tone                        # E13.0  [1] (🤌🏼)
+1F90C 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; pinched fingers: medium skin 
tone                              # E13.0  [1] (🤌🏽)
+1F90C 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; pinched fingers: medium-dark 
skin tone                         # E13.0  [1] (🤌🏾)
+1F90C 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; pinched fingers: dark skin tone 
                               # E13.0  [1] (🤌🏿)
+1F90F 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; pinching hand: light skin tone  
                               # E12.0  [1] (🤏🏻)
+1F90F 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; pinching hand: medium-light 
skin tone                          # E12.0  [1] (🤏🏼)
+1F90F 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; pinching hand: medium skin tone 
                               # E12.0  [1] (🤏🏽)
+1F90F 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; pinching hand: medium-dark skin 
tone                           # E12.0  [1] (🤏🏾)
+1F90F 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; pinching hand: dark skin tone   
                               # E12.0  [1] (🤏🏿)
+1F918 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; sign of the horns: light skin 
tone                             # E1.0   [1] (🤘🏻)
+1F918 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; sign of the horns: medium-light 
skin tone                      # E1.0   [1] (🤘🏼)
+1F918 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; sign of the horns: medium skin 
tone                            # E1.0   [1] (🤘🏽)
+1F918 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; sign of the horns: medium-dark 
skin tone                       # E1.0   [1] (🤘🏾)
+1F918 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; sign of the horns: dark skin 
tone                              # E1.0   [1] (🤘🏿)
+1F919 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; call me hand: light skin tone   
                               # E3.0   [1] (🤙🏻)
+1F919 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; call me hand: medium-light skin 
tone                           # E3.0   [1] (🤙🏼)
+1F919 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; call me hand: medium skin tone  
                               # E3.0   [1] (🤙🏽)
+1F919 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; call me hand: medium-dark skin 
tone                            # E3.0   [1] (🤙🏾)
+1F919 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; call me hand: dark skin tone    
                               # E3.0   [1] (🤙🏿)
+1F91A 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; raised back of hand: light skin 
tone                           # E3.0   [1] (🤚🏻)
+1F91A 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; raised back of hand: 
medium-light skin tone                    # E3.0   [1] (🤚🏼)
+1F91A 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; raised back of hand: medium 
skin tone                          # E3.0   [1] (🤚🏽)
+1F91A 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; raised back of hand: 
medium-dark skin tone                     # E3.0   [1] (🤚🏾)
+1F91A 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; raised back of hand: dark skin 
tone                            # E3.0   [1] (🤚🏿)
+1F91B 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; left-facing fist: light skin 
tone                              # E3.0   [1] (🤛🏻)
+1F91B 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; left-facing fist: medium-light 
skin tone                       # E3.0   [1] (🤛🏼)
+1F91B 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; left-facing fist: medium skin 
tone                             # E3.0   [1] (🤛🏽)
+1F91B 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; left-facing fist: medium-dark 
skin tone                        # E3.0   [1] (🤛🏾)
+1F91B 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; left-facing fist: dark skin 
tone                               # E3.0   [1] (🤛🏿)
+1F91C 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; right-facing fist: light skin 
tone                             # E3.0   [1] (🤜🏻)
+1F91C 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; right-facing fist: medium-light 
skin tone                      # E3.0   [1] (🤜🏼)
+1F91C 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; right-facing fist: medium skin 
tone                            # E3.0   [1] (🤜🏽)
+1F91C 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; right-facing fist: medium-dark 
skin tone                       # E3.0   [1] (🤜🏾)
+1F91C 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; right-facing fist: dark skin 
tone                              # E3.0   [1] (🤜🏿)
+1F91D 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; handshake: light skin tone      
                               # E3.0   [1] (🤝🏻)
+1F91D 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; handshake: medium-light skin 
tone                              # E3.0   [1] (🤝🏼)
+1F91D 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; handshake: medium skin tone     
                               # E3.0   [1] (🤝🏽)
+1F91D 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; handshake: medium-dark skin 
tone                               # E3.0   [1] (🤝🏾)
+1F91D 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; handshake: dark skin tone       
                               # E3.0   [1] (🤝🏿)
+1F91E 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; crossed fingers: light skin 
tone                               # E3.0   [1] (🤞🏻)
+1F91E 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; crossed fingers: medium-light 
skin tone                        # E3.0   [1] (🤞🏼)
+1F91E 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; crossed fingers: medium skin 
tone                              # E3.0   [1] (🤞🏽)
+1F91E 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; crossed fingers: medium-dark 
skin tone                         # E3.0   [1] (🤞🏾)
+1F91E 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; crossed fingers: dark skin tone 
                               # E3.0   [1] (🤞🏿)
+1F91F 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; love-you gesture: light skin 
tone                              # E5.0   [1] (🤟🏻)
+1F91F 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; love-you gesture: medium-light 
skin tone                       # E5.0   [1] (🤟🏼)
+1F91F 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; love-you gesture: medium skin 
tone                             # E5.0   [1] (🤟🏽)
+1F91F 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; love-you gesture: medium-dark 
skin tone                        # E5.0   [1] (🤟🏾)
+1F91F 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; love-you gesture: dark skin 
tone                               # E5.0   [1] (🤟🏿)
+1F926 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person facepalming: light skin 
tone                            # E3.0   [1] (🤦🏻)
+1F926 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person facepalming: 
medium-light skin tone                     # E3.0   [1] (🤦🏼)
+1F926 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person facepalming: medium skin 
tone                           # E3.0   [1] (🤦🏽)
+1F926 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person facepalming: medium-dark 
skin tone                      # E3.0   [1] (🤦🏾)
+1F926 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person facepalming: dark skin 
tone                             # E3.0   [1] (🤦🏿)
+1F930 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; pregnant woman: light skin tone 
                               # E3.0   [1] (🤰🏻)
+1F930 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; pregnant woman: medium-light 
skin tone                         # E3.0   [1] (🤰🏼)
+1F930 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; pregnant woman: medium skin 
tone                               # E3.0   [1] (🤰🏽)
+1F930 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; pregnant woman: medium-dark 
skin tone                          # E3.0   [1] (🤰🏾)
+1F930 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; pregnant woman: dark skin tone  
                               # E3.0   [1] (🤰🏿)
+1F931 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; breast-feeding: light skin tone 
                               # E5.0   [1] (🤱🏻)
+1F931 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; breast-feeding: medium-light 
skin tone                         # E5.0   [1] (🤱🏼)
+1F931 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; breast-feeding: medium skin 
tone                               # E5.0   [1] (🤱🏽)
+1F931 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; breast-feeding: medium-dark 
skin tone                          # E5.0   [1] (🤱🏾)
+1F931 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; breast-feeding: dark skin tone  
                               # E5.0   [1] (🤱🏿)
+1F932 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; palms up together: light skin 
tone                             # E5.0   [1] (🤲🏻)
+1F932 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; palms up together: medium-light 
skin tone                      # E5.0   [1] (🤲🏼)
+1F932 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; palms up together: medium skin 
tone                            # E5.0   [1] (🤲🏽)
+1F932 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; palms up together: medium-dark 
skin tone                       # E5.0   [1] (🤲🏾)
+1F932 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; palms up together: dark skin 
tone                              # E5.0   [1] (🤲🏿)
+1F933 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; selfie: light skin tone         
                               # E3.0   [1] (🤳🏻)
+1F933 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; selfie: medium-light skin tone  
                               # E3.0   [1] (🤳🏼)
+1F933 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; selfie: medium skin tone        
                               # E3.0   [1] (🤳🏽)
+1F933 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; selfie: medium-dark skin tone   
                               # E3.0   [1] (🤳🏾)
+1F933 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; selfie: dark skin tone          
                               # E3.0   [1] (🤳🏿)
+1F934 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; prince: light skin tone         
                               # E3.0   [1] (🤴🏻)
+1F934 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; prince: medium-light skin tone  
                               # E3.0   [1] (🤴🏼)
+1F934 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; prince: medium skin tone        
                               # E3.0   [1] (🤴🏽)
+1F934 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; prince: medium-dark skin tone   
                               # E3.0   [1] (🤴🏾)
+1F934 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; prince: dark skin tone          
                               # E3.0   [1] (🤴🏿)
+1F935 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person in tuxedo: light skin 
tone                              # E3.0   [1] (🤵🏻)
+1F935 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person in tuxedo: medium-light 
skin tone                       # E3.0   [1] (🤵🏼)
+1F935 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person in tuxedo: medium skin 
tone                             # E3.0   [1] (🤵🏽)
+1F935 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person in tuxedo: medium-dark 
skin tone                        # E3.0   [1] (🤵🏾)
+1F935 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person in tuxedo: dark skin 
tone                               # E3.0   [1] (🤵🏿)
+1F936 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; Mrs. Claus: light skin tone     
                               # E3.0   [1] (🤶🏻)
+1F936 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; Mrs. Claus: medium-light skin 
tone                             # E3.0   [1] (🤶🏼)
+1F936 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; Mrs. Claus: medium skin tone    
                               # E3.0   [1] (🤶🏽)
+1F936 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; Mrs. Claus: medium-dark skin 
tone                              # E3.0   [1] (🤶🏾)
+1F936 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; Mrs. Claus: dark skin tone      
                               # E3.0   [1] (🤶🏿)
+1F937 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person shrugging: light skin 
tone                              # E3.0   [1] (🤷🏻)
+1F937 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person shrugging: medium-light 
skin tone                       # E3.0   [1] (🤷🏼)
+1F937 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person shrugging: medium skin 
tone                             # E3.0   [1] (🤷🏽)
+1F937 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person shrugging: medium-dark 
skin tone                        # E3.0   [1] (🤷🏾)
+1F937 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person shrugging: dark skin 
tone                               # E3.0   [1] (🤷🏿)
+1F938 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person cartwheeling: light skin 
tone                           # E3.0   [1] (🤸🏻)
+1F938 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person cartwheeling: 
medium-light skin tone                    # E3.0   [1] (🤸🏼)
+1F938 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person cartwheeling: medium 
skin tone                          # E3.0   [1] (🤸🏽)
+1F938 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person cartwheeling: 
medium-dark skin tone                     # E3.0   [1] (🤸🏾)
+1F938 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person cartwheeling: dark skin 
tone                            # E3.0   [1] (🤸🏿)
+1F939 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person juggling: light skin 
tone                               # E3.0   [1] (🤹🏻)
+1F939 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person juggling: medium-light 
skin tone                        # E3.0   [1] (🤹🏼)
+1F939 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person juggling: medium skin 
tone                              # E3.0   [1] (🤹🏽)
+1F939 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person juggling: medium-dark 
skin tone                         # E3.0   [1] (🤹🏾)
+1F939 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person juggling: dark skin tone 
                               # E3.0   [1] (🤹🏿)
+1F93D 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person playing water polo: 
light skin tone                     # E3.0   [1] (🤽🏻)
+1F93D 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person playing water polo: 
medium-light skin tone              # E3.0   [1] (🤽🏼)
+1F93D 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person playing water polo: 
medium skin tone                    # E3.0   [1] (🤽🏽)
+1F93D 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person playing water polo: 
medium-dark skin tone               # E3.0   [1] (🤽🏾)
+1F93D 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person playing water polo: dark 
skin tone                      # E3.0   [1] (🤽🏿)
+1F93E 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person playing handball: light 
skin tone                       # E3.0   [1] (🤾🏻)
+1F93E 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person playing handball: 
medium-light skin tone                # E3.0   [1] (🤾🏼)
+1F93E 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person playing handball: medium 
skin tone                      # E3.0   [1] (🤾🏽)
+1F93E 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person playing handball: 
medium-dark skin tone                 # E3.0   [1] (🤾🏾)
+1F93E 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person playing handball: dark 
skin tone                        # E3.0   [1] (🤾🏿)
+1F977 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; ninja: light skin tone          
                               # E13.0  [1] (🥷🏻)
+1F977 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; ninja: medium-light skin tone   
                               # E13.0  [1] (🥷🏼)
+1F977 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; ninja: medium skin tone         
                               # E13.0  [1] (🥷🏽)
+1F977 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; ninja: medium-dark skin tone    
                               # E13.0  [1] (🥷🏾)
+1F977 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; ninja: dark skin tone           
                               # E13.0  [1] (🥷🏿)
+1F9B5 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; leg: light skin tone            
                               # E11.0  [1] (🦵🏻)
+1F9B5 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; leg: medium-light skin tone     
                               # E11.0  [1] (🦵🏼)
+1F9B5 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; leg: medium skin tone           
                               # E11.0  [1] (🦵🏽)
+1F9B5 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; leg: medium-dark skin tone      
                               # E11.0  [1] (🦵🏾)
+1F9B5 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; leg: dark skin tone             
                               # E11.0  [1] (🦵🏿)
+1F9B6 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; foot: light skin tone           
                               # E11.0  [1] (🦶🏻)
+1F9B6 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; foot: medium-light skin tone    
                               # E11.0  [1] (🦶🏼)
+1F9B6 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; foot: medium skin tone          
                               # E11.0  [1] (🦶🏽)
+1F9B6 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; foot: medium-dark skin tone     
                               # E11.0  [1] (🦶🏾)
+1F9B6 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; foot: dark skin tone            
                               # E11.0  [1] (🦶🏿)
+1F9B8 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; superhero: light skin tone      
                               # E11.0  [1] (🦸🏻)
+1F9B8 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; superhero: medium-light skin 
tone                              # E11.0  [1] (🦸🏼)
+1F9B8 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; superhero: medium skin tone     
                               # E11.0  [1] (🦸🏽)
+1F9B8 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; superhero: medium-dark skin 
tone                               # E11.0  [1] (🦸🏾)
+1F9B8 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; superhero: dark skin tone       
                               # E11.0  [1] (🦸🏿)
+1F9B9 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; supervillain: light skin tone   
                               # E11.0  [1] (🦹🏻)
+1F9B9 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; supervillain: medium-light skin 
tone                           # E11.0  [1] (🦹🏼)
+1F9B9 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; supervillain: medium skin tone  
                               # E11.0  [1] (🦹🏽)
+1F9B9 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; supervillain: medium-dark skin 
tone                            # E11.0  [1] (🦹🏾)
+1F9B9 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; supervillain: dark skin tone    
                               # E11.0  [1] (🦹🏿)
+1F9BB 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; ear with hearing aid: light 
skin tone                          # E12.0  [1] (🦻🏻)
+1F9BB 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; ear with hearing aid: 
medium-light skin tone                   # E12.0  [1] (🦻🏼)
+1F9BB 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; ear with hearing aid: medium 
skin tone                         # E12.0  [1] (🦻🏽)
+1F9BB 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; ear with hearing aid: 
medium-dark skin tone                    # E12.0  [1] (🦻🏾)
+1F9BB 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; ear with hearing aid: dark skin 
tone                           # E12.0  [1] (🦻🏿)
+1F9CD 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person standing: light skin 
tone                               # E12.0  [1] (🧍🏻)
+1F9CD 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person standing: medium-light 
skin tone                        # E12.0  [1] (🧍🏼)
+1F9CD 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person standing: medium skin 
tone                              # E12.0  [1] (🧍🏽)
+1F9CD 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person standing: medium-dark 
skin tone                         # E12.0  [1] (🧍🏾)
+1F9CD 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person standing: dark skin tone 
                               # E12.0  [1] (🧍🏿)
+1F9CE 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person kneeling: light skin 
tone                               # E12.0  [1] (🧎🏻)
+1F9CE 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person kneeling: medium-light 
skin tone                        # E12.0  [1] (🧎🏼)
+1F9CE 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person kneeling: medium skin 
tone                              # E12.0  [1] (🧎🏽)
+1F9CE 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person kneeling: medium-dark 
skin tone                         # E12.0  [1] (🧎🏾)
+1F9CE 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person kneeling: dark skin tone 
                               # E12.0  [1] (🧎🏿)
+1F9CF 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; deaf person: light skin tone    
                               # E12.0  [1] (🧏🏻)
+1F9CF 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; deaf person: medium-light skin 
tone                            # E12.0  [1] (🧏🏼)
+1F9CF 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; deaf person: medium skin tone   
                               # E12.0  [1] (🧏🏽)
+1F9CF 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; deaf person: medium-dark skin 
tone                             # E12.0  [1] (🧏🏾)
+1F9CF 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; deaf person: dark skin tone     
                               # E12.0  [1] (🧏🏿)
+1F9D1 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person: light skin tone         
                               # E5.0   [1] (🧑🏻)
+1F9D1 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person: medium-light skin tone  
                               # E5.0   [1] (🧑🏼)
+1F9D1 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person: medium skin tone        
                               # E5.0   [1] (🧑🏽)
+1F9D1 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person: medium-dark skin tone   
                               # E5.0   [1] (🧑🏾)
+1F9D1 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person: dark skin tone          
                               # E5.0   [1] (🧑🏿)
+1F9D2 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; child: light skin tone          
                               # E5.0   [1] (🧒🏻)
+1F9D2 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; child: medium-light skin tone   
                               # E5.0   [1] (🧒🏼)
+1F9D2 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; child: medium skin tone         
                               # E5.0   [1] (🧒🏽)
+1F9D2 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; child: medium-dark skin tone    
                               # E5.0   [1] (🧒🏾)
+1F9D2 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; child: dark skin tone           
                               # E5.0   [1] (🧒🏿)
+1F9D3 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; older person: light skin tone   
                               # E5.0   [1] (🧓🏻)
+1F9D3 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; older person: medium-light skin 
tone                           # E5.0   [1] (🧓🏼)
+1F9D3 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; older person: medium skin tone  
                               # E5.0   [1] (🧓🏽)
+1F9D3 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; older person: medium-dark skin 
tone                            # E5.0   [1] (🧓🏾)
+1F9D3 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; older person: dark skin tone    
                               # E5.0   [1] (🧓🏿)
+1F9D4 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person: light skin tone, beard  
                               # E5.0   [1] (🧔🏻)
+1F9D4 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person: medium-light skin tone, 
beard                          # E5.0   [1] (🧔🏼)
+1F9D4 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person: medium skin tone, beard 
                               # E5.0   [1] (🧔🏽)
+1F9D4 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person: medium-dark skin tone, 
beard                           # E5.0   [1] (🧔🏾)
+1F9D4 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person: dark skin tone, beard   
                               # E5.0   [1] (🧔🏿)
+1F9D5 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; woman with headscarf: light 
skin tone                          # E5.0   [1] (🧕🏻)
+1F9D5 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; woman with headscarf: 
medium-light skin tone                   # E5.0   [1] (🧕🏼)
+1F9D5 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; woman with headscarf: medium 
skin tone                         # E5.0   [1] (🧕🏽)
+1F9D5 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; woman with headscarf: 
medium-dark skin tone                    # E5.0   [1] (🧕🏾)
+1F9D5 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; woman with headscarf: dark skin 
tone                           # E5.0   [1] (🧕🏿)
+1F9D6 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person in steamy room: light 
skin tone                         # E5.0   [1] (🧖🏻)
+1F9D6 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person in steamy room: 
medium-light skin tone                  # E5.0   [1] (🧖🏼)
+1F9D6 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person in steamy room: medium 
skin tone                        # E5.0   [1] (🧖🏽)
+1F9D6 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person in steamy room: 
medium-dark skin tone                   # E5.0   [1] (🧖🏾)
+1F9D6 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person in steamy room: dark 
skin tone                          # E5.0   [1] (🧖🏿)
+1F9D7 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person climbing: light skin 
tone                               # E5.0   [1] (🧗🏻)
+1F9D7 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person climbing: medium-light 
skin tone                        # E5.0   [1] (🧗🏼)
+1F9D7 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person climbing: medium skin 
tone                              # E5.0   [1] (🧗🏽)
+1F9D7 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person climbing: medium-dark 
skin tone                         # E5.0   [1] (🧗🏾)
+1F9D7 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person climbing: dark skin tone 
                               # E5.0   [1] (🧗🏿)
+1F9D8 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person in lotus position: light 
skin tone                      # E5.0   [1] (🧘🏻)
+1F9D8 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person in lotus position: 
medium-light skin tone               # E5.0   [1] (🧘🏼)
+1F9D8 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person in lotus position: 
medium skin tone                     # E5.0   [1] (🧘🏽)
+1F9D8 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person in lotus position: 
medium-dark skin tone                # E5.0   [1] (🧘🏾)
+1F9D8 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person in lotus position: dark 
skin tone                       # E5.0   [1] (🧘🏿)
+1F9D9 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; mage: light skin tone           
                               # E5.0   [1] (🧙🏻)
+1F9D9 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; mage: medium-light skin tone    
                               # E5.0   [1] (🧙🏼)
+1F9D9 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; mage: medium skin tone          
                               # E5.0   [1] (🧙🏽)
+1F9D9 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; mage: medium-dark skin tone     
                               # E5.0   [1] (🧙🏾)
+1F9D9 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; mage: dark skin tone            
                               # E5.0   [1] (🧙🏿)
+1F9DA 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; fairy: light skin tone          
                               # E5.0   [1] (🧚🏻)
+1F9DA 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; fairy: medium-light skin tone   
                               # E5.0   [1] (🧚🏼)
+1F9DA 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; fairy: medium skin tone         
                               # E5.0   [1] (🧚🏽)
+1F9DA 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; fairy: medium-dark skin tone    
                               # E5.0   [1] (🧚🏾)
+1F9DA 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; fairy: dark skin tone           
                               # E5.0   [1] (🧚🏿)
+1F9DB 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; vampire: light skin tone        
                               # E5.0   [1] (🧛🏻)
+1F9DB 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; vampire: medium-light skin tone 
                               # E5.0   [1] (🧛🏼)
+1F9DB 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; vampire: medium skin tone       
                               # E5.0   [1] (🧛🏽)
+1F9DB 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; vampire: medium-dark skin tone  
                               # E5.0   [1] (🧛🏾)
+1F9DB 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; vampire: dark skin tone         
                               # E5.0   [1] (🧛🏿)
+1F9DC 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; merperson: light skin tone      
                               # E5.0   [1] (🧜🏻)
+1F9DC 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; merperson: medium-light skin 
tone                              # E5.0   [1] (🧜🏼)
+1F9DC 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; merperson: medium skin tone     
                               # E5.0   [1] (🧜🏽)
+1F9DC 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; merperson: medium-dark skin 
tone                               # E5.0   [1] (🧜🏾)
+1F9DC 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; merperson: dark skin tone       
                               # E5.0   [1] (🧜🏿)
+1F9DD 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; elf: light skin tone            
                               # E5.0   [1] (🧝🏻)
+1F9DD 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; elf: medium-light skin tone     
                               # E5.0   [1] (🧝🏼)
+1F9DD 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; elf: medium skin tone           
                               # E5.0   [1] (🧝🏽)
+1F9DD 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; elf: medium-dark skin tone      
                               # E5.0   [1] (🧝🏾)
+1F9DD 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; elf: dark skin tone             
                               # E5.0   [1] (🧝🏿)
+1FAC3 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; pregnant man: light skin tone   
                               # E14.0  [1] (🫃🏻)
+1FAC3 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; pregnant man: medium-light skin 
tone                           # E14.0  [1] (🫃🏼)
+1FAC3 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; pregnant man: medium skin tone  
                               # E14.0  [1] (🫃🏽)
+1FAC3 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; pregnant man: medium-dark skin 
tone                            # E14.0  [1] (🫃🏾)
+1FAC3 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; pregnant man: dark skin tone    
                               # E14.0  [1] (🫃🏿)
+1FAC4 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; pregnant person: light skin 
tone                               # E14.0  [1] (🫄🏻)
+1FAC4 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; pregnant person: medium-light 
skin tone                        # E14.0  [1] (🫄🏼)
+1FAC4 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; pregnant person: medium skin 
tone                              # E14.0  [1] (🫄🏽)
+1FAC4 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; pregnant person: medium-dark 
skin tone                         # E14.0  [1] (🫄🏾)
+1FAC4 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; pregnant person: dark skin tone 
                               # E14.0  [1] (🫄🏿)
+1FAC5 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; person with crown: light skin 
tone                             # E14.0  [1] (🫅🏻)
+1FAC5 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; person with crown: medium-light 
skin tone                      # E14.0  [1] (🫅🏼)
+1FAC5 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; person with crown: medium skin 
tone                            # E14.0  [1] (🫅🏽)
+1FAC5 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; person with crown: medium-dark 
skin tone                       # E14.0  [1] (🫅🏾)
+1FAC5 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; person with crown: dark skin 
tone                              # E14.0  [1] (🫅🏿)
+1FAF0 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; hand with index finger and 
thumb crossed: light skin tone      # E14.0  [1] (🫰🏻)
+1FAF0 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; hand with index finger and 
thumb crossed: medium-light skin tone #E14.0 [1] (🫰🏼)
+1FAF0 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; hand with index finger and 
thumb crossed: medium skin tone     # E14.0  [1] (🫰🏽)
+1FAF0 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; hand with index finger and 
thumb crossed: medium-dark skin tone #E14.0  [1] (🫰🏾)
+1FAF0 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; hand with index finger and 
thumb crossed: dark skin tone       # E14.0  [1] (🫰🏿)
+1FAF1 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; rightwards hand: light skin 
tone                               # E14.0  [1] (🫱🏻)
+1FAF1 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; rightwards hand: medium-light 
skin tone                        # E14.0  [1] (🫱🏼)
+1FAF1 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; rightwards hand: medium skin 
tone                              # E14.0  [1] (🫱🏽)
+1FAF1 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; rightwards hand: medium-dark 
skin tone                         # E14.0  [1] (🫱🏾)
+1FAF1 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; rightwards hand: dark skin tone 
                               # E14.0  [1] (🫱🏿)
+1FAF2 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; leftwards hand: light skin tone 
                               # E14.0  [1] (🫲🏻)
+1FAF2 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; leftwards hand: medium-light 
skin tone                         # E14.0  [1] (🫲🏼)
+1FAF2 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; leftwards hand: medium skin 
tone                               # E14.0  [1] (🫲🏽)
+1FAF2 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; leftwards hand: medium-dark 
skin tone                          # E14.0  [1] (🫲🏾)
+1FAF2 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; leftwards hand: dark skin tone  
                               # E14.0  [1] (🫲🏿)
+1FAF3 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; palm down hand: light skin tone 
                               # E14.0  [1] (🫳🏻)
+1FAF3 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; palm down hand: medium-light 
skin tone                         # E14.0  [1] (🫳🏼)
+1FAF3 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; palm down hand: medium skin 
tone                               # E14.0  [1] (🫳🏽)
+1FAF3 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; palm down hand: medium-dark 
skin tone                          # E14.0  [1] (🫳🏾)
+1FAF3 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; palm down hand: dark skin tone  
                               # E14.0  [1] (🫳🏿)
+1FAF4 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; palm up hand: light skin tone   
                               # E14.0  [1] (🫴🏻)
+1FAF4 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; palm up hand: medium-light skin 
tone                           # E14.0  [1] (🫴🏼)
+1FAF4 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; palm up hand: medium skin tone  
                               # E14.0  [1] (🫴🏽)
+1FAF4 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; palm up hand: medium-dark skin 
tone                            # E14.0  [1] (🫴🏾)
+1FAF4 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; palm up hand: dark skin tone    
                               # E14.0  [1] (🫴🏿)
+1FAF5 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; index pointing at the viewer: 
light skin tone                  # E14.0  [1] (🫵🏻)
+1FAF5 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; index pointing at the viewer: 
medium-light skin tone           # E14.0  [1] (🫵🏼)
+1FAF5 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; index pointing at the viewer: 
medium skin tone                 # E14.0  [1] (🫵🏽)
+1FAF5 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; index pointing at the viewer: 
medium-dark skin tone            # E14.0  [1] (🫵🏾)
+1FAF5 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; index pointing at the viewer: 
dark skin tone                   # E14.0  [1] (🫵🏿)
+1FAF6 1F3FB   ; RGI_Emoji_Modifier_Sequence  ; heart hands: light skin tone    
                               # E14.0  [1] (🫶🏻)
+1FAF6 1F3FC   ; RGI_Emoji_Modifier_Sequence  ; heart hands: medium-light skin 
tone                            # E14.0  [1] (🫶🏼)
+1FAF6 1F3FD   ; RGI_Emoji_Modifier_Sequence  ; heart hands: medium skin tone   
                               # E14.0  [1] (🫶🏽)
+1FAF6 1F3FE   ; RGI_Emoji_Modifier_Sequence  ; heart hands: medium-dark skin 
tone                             # E14.0  [1] (🫶🏾)
+1FAF6 1F3FF   ; RGI_Emoji_Modifier_Sequence  ; heart hands: dark skin tone     
                               # E14.0  [1] (🫶🏿)
+
+# Total elements: 645
+
+#EOF
diff --git a/admin/unidata/emoji-zwj-sequences.txt 
b/admin/unidata/emoji-zwj-sequences.txt
new file mode 100644
index 0000000000..6f94721a73
--- /dev/null
+++ b/admin/unidata/emoji-zwj-sequences.txt
@@ -0,0 +1,1410 @@
+# emoji-zwj-sequences.txt
+# Date: 2021-06-08, 05:19:16 GMT
+# © 2021 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in 
the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Emoji ZWJ Sequences for UTS #51
+# Version: 14.0
+#
+# For documentation and usage, see http://www.unicode.org/reports/tr51
+#
+# Format:
+#   code_point(s) ; type_field ; description # comments
+# Fields:
+#   code_point(s): one or more code points in hex format, separated by spaces
+#   type_field :RGI_Emoji_ZWJ_Sequence
+#     The type_field is a convenience for parsing the emoji sequence files, 
and is not intended to be maintained as a property.
+#   short name: CLDR short name of sequence; characters may be escaped with 
\x{hex}.
+#
+# For the purpose of regular expressions, the above type field defines the 
name of
+# a binary property of strings. The short name of the property is the same as 
the long name.
+#
+# Characters and sequences are listed in code point order. Users should be 
shown a more natural order.
+# See the CLDR collation order for Emoji.
+
+# ================================================
+
+# RGI_Emoji_ZWJ_Sequence: Family
+
+1F468 200D 2764 FE0F 200D 1F468             ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man                                    # E2.0   [1] (👨‍❤️‍👨)
+1F468 200D 2764 FE0F 200D 1F48B 200D 1F468  ; RGI_Emoji_ZWJ_Sequence  ; kiss: 
man, man                                                 # E2.0   [1] (👨‍❤️‍💋‍👨)
+1F468 200D 1F466                            ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, boy                                               # E4.0   [1] 
(👨‍👦)
+1F468 200D 1F466 200D 1F466                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, boy, boy                                          # E4.0   [1] 
(👨‍👦‍👦)
+1F468 200D 1F467                            ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, girl                                              # E4.0   [1] 
(👨‍👧)
+1F468 200D 1F467 200D 1F466                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, girl, boy                                         # E4.0   [1] 
(👨‍👧‍👦)
+1F468 200D 1F467 200D 1F467                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, girl, girl                                        # E4.0   [1] 
(👨‍👧‍👧)
+1F468 200D 1F468 200D 1F466                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, man, boy                                          # E2.0   [1] 
(👨‍👨‍👦)
+1F468 200D 1F468 200D 1F466 200D 1F466      ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, man, boy, boy                                     # E2.0   [1] 
(👨‍👨‍👦‍👦)
+1F468 200D 1F468 200D 1F467                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, man, girl                                         # E2.0   [1] 
(👨‍👨‍👧)
+1F468 200D 1F468 200D 1F467 200D 1F466      ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, man, girl, boy                                    # E2.0   [1] 
(👨‍👨‍👧‍👦)
+1F468 200D 1F468 200D 1F467 200D 1F467      ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, man, girl, girl                                   # E2.0   [1] 
(👨‍👨‍👧‍👧)
+1F468 200D 1F469 200D 1F466                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, woman, boy                                        # E2.0   [1] 
(👨‍👩‍👦)
+1F468 200D 1F469 200D 1F466 200D 1F466      ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, woman, boy, boy                                   # E2.0   [1] 
(👨‍👩‍👦‍👦)
+1F468 200D 1F469 200D 1F467                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, woman, girl                                       # E2.0   [1] 
(👨‍👩‍👧)
+1F468 200D 1F469 200D 1F467 200D 1F466      ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, woman, girl, boy                                  # E2.0   [1] 
(👨‍👩‍👧‍👦)
+1F468 200D 1F469 200D 1F467 200D 1F467      ; RGI_Emoji_ZWJ_Sequence  ; 
family: man, woman, girl, girl                                 # E2.0   [1] 
(👨‍👩‍👧‍👧)
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, light skin tone                   # E13.1  [1] (👨🏻‍❤️‍👨🏻)
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, light skin tone, medium-light skin tone #E13.1[1] 
(👨🏻‍❤️‍👨🏼)
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, light skin tone, medium skin tone # E13.1  [1] (👨🏻‍❤️‍👨🏽)
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, light skin tone, medium-dark skin tone #E13.1[1] 
(👨🏻‍❤️‍👨🏾)
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, light skin tone, dark skin tone   # E13.1  [1] (👨🏻‍❤️‍👨🏿)
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, light skin tone                        
# E13.1  [1] (👨🏻‍❤️‍💋‍👨🏻)
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, light skin tone, medium-light skin tone 
#E13.1  [1] (👨🏻‍❤️‍💋‍👨🏼)
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, light skin tone, medium skin tone      
# E13.1  [1] (👨🏻‍❤️‍💋‍👨🏽)
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, light skin tone, medium-dark skin tone 
# E13.1  [1] (👨🏻‍❤️‍💋‍👨🏾)
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, light skin tone, dark skin tone        
# E13.1  [1] (👨🏻‍❤️‍💋‍👨🏿)
+1F468 1F3FB 200D 1F91D 200D 1F468 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: light skin tone, medium-light skin tone     # E12.1  [1] 
(👨🏻‍🤝‍👨🏼)
+1F468 1F3FB 200D 1F91D 200D 1F468 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: light skin tone, medium skin tone           # E12.1  [1] 
(👨🏻‍🤝‍👨🏽)
+1F468 1F3FB 200D 1F91D 200D 1F468 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: light skin tone, medium-dark skin tone      # E12.1  [1] 
(👨🏻‍🤝‍👨🏾)
+1F468 1F3FB 200D 1F91D 200D 1F468 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: light skin tone, dark skin tone             # E12.1  [1] 
(👨🏻‍🤝‍👨🏿)
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-light skin tone, light skin tone #E13.1[1] 
(👨🏼‍❤️‍👨🏻)
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-light skin tone            # E13.1  [1] (👨🏼‍❤️‍👨🏼)
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-light skin tone, medium skin tone #E13.1[1] 
(👨🏼‍❤️‍👨🏽)
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-light skin tone, medium-dark skin tone #E13.1[1] 
(👨🏼‍❤️‍👨🏾)
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-light skin tone, dark skin tone #E13.1[1] 
(👨🏼‍❤️‍👨🏿)
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-light skin tone, light skin tone 
#E13.1  [1] (👨🏼‍❤️‍💋‍👨🏻)
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-light skin tone                 
# E13.1  [1] (👨🏼‍❤️‍💋‍👨🏼)
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-light skin tone, medium skin 
tone #E13.1 [1] (👨🏼‍❤️‍💋‍👨🏽)
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-light skin tone, medium-dark 
skin tone #E13.1[1] (👨🏼‍❤️‍💋‍👨🏾)
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-light skin tone, dark skin tone 
# E13.1  [1] (👨🏼‍❤️‍💋‍👨🏿)
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium-light skin tone, light skin tone     # E12.0  [1] 
(👨🏼‍🤝‍👨🏻)
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium-light skin tone, medium skin tone    # E12.1  [1] 
(👨🏼‍🤝‍👨🏽)
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium-light skin tone, medium-dark skin tone #E12.1 [1] 
(👨🏼‍🤝‍👨🏾)
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium-light skin tone, dark skin tone      # E12.1  [1] 
(👨🏼‍🤝‍👨🏿)
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium skin tone, light skin tone # E13.1  [1] (👨🏽‍❤️‍👨🏻)
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium skin tone, medium-light skin tone #E13.1[1] 
(👨🏽‍❤️‍👨🏼)
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium skin tone                  # E13.1  [1] (👨🏽‍❤️‍👨🏽)
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium skin tone, medium-dark skin tone #E13.1[1] 
(👨🏽‍❤️‍👨🏾)
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium skin tone, dark skin tone  # E13.1  [1] (👨🏽‍❤️‍👨🏿)
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium skin tone, light skin tone      
# E13.1  [1] (👨🏽‍❤️‍💋‍👨🏻)
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium skin tone, medium-light skin 
tone #E13.1 [1] (👨🏽‍❤️‍💋‍👨🏼)
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium skin tone                       
# E13.1  [1] (👨🏽‍❤️‍💋‍👨🏽)
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium skin tone, medium-dark skin tone 
#E13.1  [1] (👨🏽‍❤️‍💋‍👨🏾)
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium skin tone, dark skin tone       
# E13.1  [1] (👨🏽‍❤️‍💋‍👨🏿)
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium skin tone, light skin tone           # E12.0  [1] 
(👨🏽‍🤝‍👨🏻)
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium skin tone, medium-light skin tone    # E12.0  [1] 
(👨🏽‍🤝‍👨🏼)
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium skin tone, medium-dark skin tone     # E12.1  [1] 
(👨🏽‍🤝‍👨🏾)
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium skin tone, dark skin tone            # E12.1  [1] 
(👨🏽‍🤝‍👨🏿)
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-dark skin tone, light skin tone #E13.1[1] 
(👨🏾‍❤️‍👨🏻)
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-dark skin tone, medium-light skin tone #E13.1[1] 
(👨🏾‍❤️‍👨🏼)
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-dark skin tone, medium skin tone #E13.1[1] 
(👨🏾‍❤️‍👨🏽)
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-dark skin tone             # E13.1  [1] (👨🏾‍❤️‍👨🏾)
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, medium-dark skin tone, dark skin tone #E13.1[1] (👨🏾‍❤️‍👨🏿)
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-dark skin tone, light skin tone 
# E13.1  [1] (👨🏾‍❤️‍💋‍👨🏻)
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-dark skin tone, medium-light 
skin tone #E13.1[1] (👨🏾‍❤️‍💋‍👨🏼)
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-dark skin tone, medium skin tone 
#E13.1  [1] (👨🏾‍❤️‍💋‍👨🏽)
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-dark skin tone                  
# E13.1  [1] (👨🏾‍❤️‍💋‍👨🏾)
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, medium-dark skin tone, dark skin tone  
# E13.1  [1] (👨🏾‍❤️‍💋‍👨🏿)
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium-dark skin tone, light skin tone      # E12.0  [1] 
(👨🏾‍🤝‍👨🏻)
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium-dark skin tone, medium-light skin tone #E12.0 [1] 
(👨🏾‍🤝‍👨🏼)
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium-dark skin tone, medium skin tone     # E12.0  [1] 
(👨🏾‍🤝‍👨🏽)
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: medium-dark skin tone, dark skin tone       # E12.1  [1] 
(👨🏾‍🤝‍👨🏿)
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, dark skin tone, light skin tone   # E13.1  [1] (👨🏿‍❤️‍👨🏻)
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, dark skin tone, medium-light skin tone #E13.1[1] 
(👨🏿‍❤️‍👨🏼)
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, dark skin tone, medium skin tone  # E13.1  [1] (👨🏿‍❤️‍👨🏽)
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, dark skin tone, medium-dark skin tone #E13.1[1] (👨🏿‍❤️‍👨🏾)
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: man, man, dark skin tone                    # E13.1  [1] (👨🏿‍❤️‍👨🏿)
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, dark skin tone, light skin tone        
# E13.1  [1] (👨🏿‍❤️‍💋‍👨🏻)
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, dark skin tone, medium-light skin tone 
# E13.1  [1] (👨🏿‍❤️‍💋‍👨🏼)
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, dark skin tone, medium skin tone       
# E13.1  [1] (👨🏿‍❤️‍💋‍👨🏽)
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, dark skin tone, medium-dark skin tone  
# E13.1  [1] (👨🏿‍❤️‍💋‍👨🏾)
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: man, man, dark skin tone                         
# E13.1  [1] (👨🏿‍❤️‍💋‍👨🏿)
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: dark skin tone, light skin tone             # E12.0  [1] 
(👨🏿‍🤝‍👨🏻)
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: dark skin tone, medium-light skin tone      # E12.0  [1] 
(👨🏿‍🤝‍👨🏼)
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: dark skin tone, medium skin tone            # E12.0  [1] 
(👨🏿‍🤝‍👨🏽)
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; men 
holding hands: dark skin tone, medium-dark skin tone       # E12.0  [1] 
(👨🏿‍🤝‍👨🏾)
+1F469 200D 2764 FE0F 200D 1F468             ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man                                  # E2.0   [1] (👩‍❤️‍👨)
+1F469 200D 2764 FE0F 200D 1F469             ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman                                # E2.0   [1] (👩‍❤️‍👩)
+1F469 200D 2764 FE0F 200D 1F48B 200D 1F468  ; RGI_Emoji_ZWJ_Sequence  ; kiss: 
woman, man                                               # E2.0   [1] (👩‍❤️‍💋‍👨)
+1F469 200D 2764 FE0F 200D 1F48B 200D 1F469  ; RGI_Emoji_ZWJ_Sequence  ; kiss: 
woman, woman                                             # E2.0   [1] (👩‍❤️‍💋‍👩)
+1F469 200D 1F466                            ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, boy                                             # E4.0   [1] 
(👩‍👦)
+1F469 200D 1F466 200D 1F466                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, boy, boy                                        # E4.0   [1] 
(👩‍👦‍👦)
+1F469 200D 1F467                            ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, girl                                            # E4.0   [1] 
(👩‍👧)
+1F469 200D 1F467 200D 1F466                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, girl, boy                                       # E4.0   [1] 
(👩‍👧‍👦)
+1F469 200D 1F467 200D 1F467                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, girl, girl                                      # E4.0   [1] 
(👩‍👧‍👧)
+1F469 200D 1F469 200D 1F466                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, woman, boy                                      # E2.0   [1] 
(👩‍👩‍👦)
+1F469 200D 1F469 200D 1F466 200D 1F466      ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, woman, boy, boy                                 # E2.0   [1] 
(👩‍👩‍👦‍👦)
+1F469 200D 1F469 200D 1F467                 ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, woman, girl                                     # E2.0   [1] 
(👩‍👩‍👧)
+1F469 200D 1F469 200D 1F467 200D 1F466      ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, woman, girl, boy                                # E2.0   [1] 
(👩‍👩‍👧‍👦)
+1F469 200D 1F469 200D 1F467 200D 1F467      ; RGI_Emoji_ZWJ_Sequence  ; 
family: woman, woman, girl, girl                               # E2.0   [1] 
(👩‍👩‍👧‍👧)
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, light skin tone                 # E13.1  [1] (👩🏻‍❤️‍👨🏻)
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, light skin tone, medium-light skin tone #E13.1[1] 
(👩🏻‍❤️‍👨🏼)
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, light skin tone, medium skin tone #E13.1 [1] (👩🏻‍❤️‍👨🏽)
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, light skin tone, medium-dark skin tone #E13.1[1] 
(👩🏻‍❤️‍👨🏾)
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, light skin tone, dark skin tone # E13.1  [1] (👩🏻‍❤️‍👨🏿)
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, light skin tone               # E13.1  [1] (👩🏻‍❤️‍👩🏻)
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, light skin tone, medium-light skin tone #E13.1[1] 
(👩🏻‍❤️‍👩🏼)
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, light skin tone, medium skin tone #E13.1[1] (👩🏻‍❤️‍👩🏽)
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, light skin tone, medium-dark skin tone #E13.1[1] 
(👩🏻‍❤️‍👩🏾)
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, light skin tone, dark skin tone #E13.1 [1] (👩🏻‍❤️‍👩🏿)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, light skin tone                      
# E13.1  [1] (👩🏻‍❤️‍💋‍👨🏻)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, light skin tone, medium-light skin 
tone #E13.1[1] (👩🏻‍❤️‍💋‍👨🏼)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, light skin tone, medium skin tone    
# E13.1  [1] (👩🏻‍❤️‍💋‍👨🏽)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, light skin tone, medium-dark skin 
tone #E13.1 [1] (👩🏻‍❤️‍💋‍👨🏾)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, light skin tone, dark skin tone      
# E13.1  [1] (👩🏻‍❤️‍💋‍👨🏿)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, light skin tone                    
# E13.1  [1] (👩🏻‍❤️‍💋‍👩🏻)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, light skin tone, medium-light skin 
tone #E13.1[1] (👩🏻‍❤️‍💋‍👩🏼)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, light skin tone, medium skin tone  
# E13.1  [1] (👩🏻‍❤️‍💋‍👩🏽)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, light skin tone, medium-dark skin 
tone #E13.1[1] (👩🏻‍❤️‍💋‍👩🏾)
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, light skin tone, dark skin tone    
# E13.1  [1] (👩🏻‍❤️‍💋‍👩🏿)
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: light skin tone, medium-light skin tone #E12.0[1] 
(👩🏻‍🤝‍👨🏼)
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: light skin tone, medium skin tone # E12.0  [1] (👩🏻‍🤝‍👨🏽)
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: light skin tone, medium-dark skin tone #E12.0[1] 
(👩🏻‍🤝‍👨🏾)
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: light skin tone, dark skin tone   # E12.0  [1] (👩🏻‍🤝‍👨🏿)
+1F469 1F3FB 200D 1F91D 200D 1F469 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: light skin tone, medium-light skin tone   # E12.1  [1] (👩🏻‍🤝‍👩🏼)
+1F469 1F3FB 200D 1F91D 200D 1F469 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: light skin tone, medium skin tone         # E12.1  [1] (👩🏻‍🤝‍👩🏽)
+1F469 1F3FB 200D 1F91D 200D 1F469 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: light skin tone, medium-dark skin tone    # E12.1  [1] (👩🏻‍🤝‍👩🏾)
+1F469 1F3FB 200D 1F91D 200D 1F469 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: light skin tone, dark skin tone           # E12.1  [1] (👩🏻‍🤝‍👩🏿)
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-light skin tone, light skin tone #E13.1[1] 
(👩🏼‍❤️‍👨🏻)
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-light skin tone          # E13.1  [1] (👩🏼‍❤️‍👨🏼)
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-light skin tone, medium skin tone #E13.1[1] 
(👩🏼‍❤️‍👨🏽)
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-light skin tone, medium-dark skin tone #E13.1[1] 
(👩🏼‍❤️‍👨🏾)
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-light skin tone, dark skin tone #E13.1[1] 
(👩🏼‍❤️‍👨🏿)
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-light skin tone, light skin tone #E13.1[1] 
(👩🏼‍❤️‍👩🏻)
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-light skin tone        # E13.1  [1] (👩🏼‍❤️‍👩🏼)
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-light skin tone, medium skin tone #E13.1[1] 
(👩🏼‍❤️‍👩🏽)
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-light skin tone, medium-dark skin tone 
#E13.1[1] (👩🏼‍❤️‍👩🏾)
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-light skin tone, dark skin tone #E13.1[1] 
(👩🏼‍❤️‍👩🏿)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-light skin tone, light skin 
tone #E13.1[1] (👩🏼‍❤️‍💋‍👨🏻)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-light skin tone               
# E13.1  [1] (👩🏼‍❤️‍💋‍👨🏼)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-light skin tone, medium skin 
tone #E13.1[1] (👩🏼‍❤️‍💋‍👨🏽)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-light skin tone, medium-dark 
skin tone #E13.1[1] (👩🏼‍❤️‍💋‍👨🏾)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-light skin tone, dark skin 
tone #E13.1 [1] (👩🏼‍❤️‍💋‍👨🏿)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-light skin tone, light skin 
tone #E13.1[1] (👩🏼‍❤️‍💋‍👩🏻)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-light skin tone             
# E13.1  [1] (👩🏼‍❤️‍💋‍👩🏼)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-light skin tone, medium skin 
tone #E13.1[1] (👩🏼‍❤️‍💋‍👩🏽)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-light skin tone, medium-dark 
skin tone #E13.1[1] (👩🏼‍❤️‍💋‍👩🏾)
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-light skin tone, dark skin 
tone #E13.1[1] (👩🏼‍❤️‍💋‍👩🏿)
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium-light skin tone, light skin tone #E12.0[1] 
(👩🏼‍🤝‍👨🏻)
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium-light skin tone, medium skin tone #E12.0[1] 
(👩🏼‍🤝‍👨🏽)
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium-light skin tone, medium-dark skin tone #E12.0[1] 
(👩🏼‍🤝‍👨🏾)
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium-light skin tone, dark skin tone #E12.0[1] 
(👩🏼‍🤝‍👨🏿)
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium-light skin tone, light skin tone   # E12.0  [1] (👩🏼‍🤝‍👩🏻)
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium-light skin tone, medium skin tone  # E12.1  [1] (👩🏼‍🤝‍👩🏽)
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium-light skin tone, medium-dark skin tone #E12.1[1] (👩🏼‍🤝‍👩🏾)
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium-light skin tone, dark skin tone    # E12.1  [1] (👩🏼‍🤝‍👩🏿)
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium skin tone, light skin tone #E13.1 [1] (👩🏽‍❤️‍👨🏻)
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium skin tone, medium-light skin tone #E13.1[1] 
(👩🏽‍❤️‍👨🏼)
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium skin tone                # E13.1  [1] (👩🏽‍❤️‍👨🏽)
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium skin tone, medium-dark skin tone #E13.1[1] 
(👩🏽‍❤️‍👨🏾)
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium skin tone, dark skin tone #E13.1  [1] (👩🏽‍❤️‍👨🏿)
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium skin tone, light skin tone #E13.1[1] (👩🏽‍❤️‍👩🏻)
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium skin tone, medium-light skin tone #E13.1[1] 
(👩🏽‍❤️‍👩🏼)
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium skin tone              # E13.1  [1] (👩🏽‍❤️‍👩🏽)
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium skin tone, medium-dark skin tone #E13.1[1] 
(👩🏽‍❤️‍👩🏾)
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium skin tone, dark skin tone #E13.1[1] (👩🏽‍❤️‍👩🏿)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium skin tone, light skin tone    
# E13.1  [1] (👩🏽‍❤️‍💋‍👨🏻)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium skin tone, medium-light skin 
tone #E13.1[1] (👩🏽‍❤️‍💋‍👨🏼)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium skin tone                     
# E13.1  [1] (👩🏽‍❤️‍💋‍👨🏽)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium skin tone, medium-dark skin 
tone #E13.1[1] (👩🏽‍❤️‍💋‍👨🏾)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium skin tone, dark skin tone     
# E13.1  [1] (👩🏽‍❤️‍💋‍👨🏿)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium skin tone, light skin tone  
# E13.1  [1] (👩🏽‍❤️‍💋‍👩🏻)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium skin tone, medium-light skin 
tone #E13.1[1] (👩🏽‍❤️‍💋‍👩🏼)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium skin tone                   
# E13.1  [1] (👩🏽‍❤️‍💋‍👩🏽)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium skin tone, medium-dark skin 
tone #E13.1[1] (👩🏽‍❤️‍💋‍👩🏾)
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium skin tone, dark skin tone   
# E13.1  [1] (👩🏽‍❤️‍💋‍👩🏿)
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium skin tone, light skin tone # E12.0  [1] (👩🏽‍🤝‍👨🏻)
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium skin tone, medium-light skin tone #E12.0[1] 
(👩🏽‍🤝‍👨🏼)
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium skin tone, medium-dark skin tone #E12.0[1] 
(👩🏽‍🤝‍👨🏾)
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium skin tone, dark skin tone  # E12.0  [1] (👩🏽‍🤝‍👨🏿)
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium skin tone, light skin tone         # E12.0  [1] (👩🏽‍🤝‍👩🏻)
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium skin tone, medium-light skin tone  # E12.0  [1] (👩🏽‍🤝‍👩🏼)
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium skin tone, medium-dark skin tone   # E12.1  [1] (👩🏽‍🤝‍👩🏾)
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium skin tone, dark skin tone          # E12.1  [1] (👩🏽‍🤝‍👩🏿)
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-dark skin tone, light skin tone #E13.1[1] 
(👩🏾‍❤️‍👨🏻)
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-dark skin tone, medium-light skin tone #E13.1[1] 
(👩🏾‍❤️‍👨🏼)
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-dark skin tone, medium skin tone #E13.1[1] 
(👩🏾‍❤️‍👨🏽)
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-dark skin tone           # E13.1  [1] (👩🏾‍❤️‍👨🏾)
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, medium-dark skin tone, dark skin tone #E13.1[1] 
(👩🏾‍❤️‍👨🏿)
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-dark skin tone, light skin tone #E13.1[1] 
(👩🏾‍❤️‍👩🏻)
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-dark skin tone, medium-light skin tone 
#E13.1[1] (👩🏾‍❤️‍👩🏼)
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-dark skin tone, medium skin tone #E13.1[1] 
(👩🏾‍❤️‍👩🏽)
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-dark skin tone         # E13.1  [1] (👩🏾‍❤️‍👩🏾)
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, medium-dark skin tone, dark skin tone #E13.1[1] 
(👩🏾‍❤️‍👩🏿)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-dark skin tone, light skin 
tone #E13.1 [1] (👩🏾‍❤️‍💋‍👨🏻)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-dark skin tone, medium-light 
skin tone #E13.1[1] (👩🏾‍❤️‍💋‍👨🏼)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-dark skin tone, medium skin 
tone #E13.1[1] (👩🏾‍❤️‍💋‍👨🏽)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-dark skin tone                
# E13.1  [1] (👩🏾‍❤️‍💋‍👨🏾)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, medium-dark skin tone, dark skin tone 
#E13.1  [1] (👩🏾‍❤️‍💋‍👨🏿)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-dark skin tone, light skin 
tone #E13.1[1] (👩🏾‍❤️‍💋‍👩🏻)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-dark skin tone, medium-light 
skin tone #E13.1[1] (👩🏾‍❤️‍💋‍👩🏼)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-dark skin tone, medium skin 
tone #E13.1[1] (👩🏾‍❤️‍💋‍👩🏽)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-dark skin tone              
# E13.1  [1] (👩🏾‍❤️‍💋‍👩🏾)
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, medium-dark skin tone, dark skin 
tone #E13.1[1] (👩🏾‍❤️‍💋‍👩🏿)
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium-dark skin tone, light skin tone #E12.0[1] 
(👩🏾‍🤝‍👨🏻)
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium-dark skin tone, medium-light skin tone #E12.0[1] 
(👩🏾‍🤝‍👨🏼)
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium-dark skin tone, medium skin tone #E12.0[1] 
(👩🏾‍🤝‍👨🏽)
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: medium-dark skin tone, dark skin tone #E12.0[1] (👩🏾‍🤝‍👨🏿)
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium-dark skin tone, light skin tone    # E12.0  [1] (👩🏾‍🤝‍👩🏻)
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium-dark skin tone, medium-light skin tone #E12.0[1] (👩🏾‍🤝‍👩🏼)
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium-dark skin tone, medium skin tone   # E12.0  [1] (👩🏾‍🤝‍👩🏽)
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: medium-dark skin tone, dark skin tone     # E12.1  [1] (👩🏾‍🤝‍👩🏿)
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, dark skin tone, light skin tone # E13.1  [1] (👩🏿‍❤️‍👨🏻)
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, dark skin tone, medium-light skin tone #E13.1[1] 
(👩🏿‍❤️‍👨🏼)
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, dark skin tone, medium skin tone #E13.1  [1] (👩🏿‍❤️‍👨🏽)
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, dark skin tone, medium-dark skin tone #E13.1[1] 
(👩🏿‍❤️‍👨🏾)
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, man, dark skin tone                  # E13.1  [1] (👩🏿‍❤️‍👨🏿)
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, dark skin tone, light skin tone #E13.1 [1] (👩🏿‍❤️‍👩🏻)
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, dark skin tone, medium-light skin tone #E13.1[1] 
(👩🏿‍❤️‍👩🏼)
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, dark skin tone, medium skin tone #E13.1[1] (👩🏿‍❤️‍👩🏽)
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, dark skin tone, medium-dark skin tone #E13.1[1] 
(👩🏿‍❤️‍👩🏾)
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: woman, woman, dark skin tone                # E13.1  [1] (👩🏿‍❤️‍👩🏿)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, dark skin tone, light skin tone      
# E13.1  [1] (👩🏿‍❤️‍💋‍👨🏻)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, dark skin tone, medium-light skin 
tone #E13.1 [1] (👩🏿‍❤️‍💋‍👨🏼)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, dark skin tone, medium skin tone     
# E13.1  [1] (👩🏿‍❤️‍💋‍👨🏽)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, dark skin tone, medium-dark skin tone 
#E13.1  [1] (👩🏿‍❤️‍💋‍👨🏾)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, man, dark skin tone                       
# E13.1  [1] (👩🏿‍❤️‍💋‍👨🏿)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, dark skin tone, light skin tone    
# E13.1  [1] (👩🏿‍❤️‍💋‍👩🏻)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, dark skin tone, medium-light skin 
tone #E13.1[1] (👩🏿‍❤️‍💋‍👩🏼)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, dark skin tone, medium skin tone   
# E13.1  [1] (👩🏿‍❤️‍💋‍👩🏽)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, dark skin tone, medium-dark skin 
tone #E13.1[1] (👩🏿‍❤️‍💋‍👩🏾)
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: woman, woman, dark skin tone                     
# E13.1  [1] (👩🏿‍❤️‍💋‍👩🏿)
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: dark skin tone, light skin tone   # E12.0  [1] (👩🏿‍🤝‍👨🏻)
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: dark skin tone, medium-light skin tone #E12.0[1] 
(👩🏿‍🤝‍👨🏼)
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: dark skin tone, medium skin tone  # E12.0  [1] (👩🏿‍🤝‍👨🏽)
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; woman 
and man holding hands: dark skin tone, medium-dark skin tone #E12.0[1] (👩🏿‍🤝‍👨🏾)
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: dark skin tone, light skin tone           # E12.0  [1] (👩🏿‍🤝‍👩🏻)
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: dark skin tone, medium-light skin tone    # E12.0  [1] (👩🏿‍🤝‍👩🏼)
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: dark skin tone, medium skin tone          # E12.0  [1] (👩🏿‍🤝‍👩🏽)
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; women 
holding hands: dark skin tone, medium-dark skin tone     # E12.0  [1] (👩🏿‍🤝‍👩🏾)
+1F9D1 200D 1F91D 200D 1F9D1                 ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands                                           # E12.0  [1] (🧑‍🤝‍🧑)
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, light skin tone, medium-light 
skin tone #E13.1[1] (🧑🏻‍❤️‍💋‍🧑🏼)
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, light skin tone, medium skin tone 
#E13.1  [1] (🧑🏻‍❤️‍💋‍🧑🏽)
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, light skin tone, medium-dark skin 
tone #E13.1[1] (🧑🏻‍❤️‍💋‍🧑🏾)
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, light skin tone, dark skin tone  
# E13.1  [1] (🧑🏻‍❤️‍💋‍🧑🏿)
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F9D1 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, light skin tone, medium-light skin tone #E13.1[1] 
(🧑🏻‍❤️‍🧑🏼)
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F9D1 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, light skin tone, medium skin tone #E13.1[1] 
(🧑🏻‍❤️‍🧑🏽)
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F9D1 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, light skin tone, medium-dark skin tone #E13.1[1] 
(🧑🏻‍❤️‍🧑🏾)
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F9D1 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, light skin tone, dark skin tone #E13.1[1] (🧑🏻‍❤️‍🧑🏿)
+1F9D1 1F3FB 200D 1F384                      ; RGI_Emoji_ZWJ_Sequence  ; mx 
claus: light skin tone                                      # E13.0  [1] (🧑🏻‍🎄)
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: light skin tone                          # E12.0  [1] (🧑🏻‍🤝‍🧑🏻)
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: light skin tone, medium-light skin tone  # E12.1  [1] (🧑🏻‍🤝‍🧑🏼)
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: light skin tone, medium skin tone        # E12.1  [1] (🧑🏻‍🤝‍🧑🏽)
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: light skin tone, medium-dark skin tone   # E12.1  [1] (🧑🏻‍🤝‍🧑🏾)
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: light skin tone, dark skin tone          # E12.1  [1] (🧑🏻‍🤝‍🧑🏿)
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium-light skin tone, light 
skin tone #E13.1[1] (🧑🏼‍❤️‍💋‍🧑🏻)
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium-light skin tone, medium 
skin tone #E13.1[1] (🧑🏼‍❤️‍💋‍🧑🏽)
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium-light skin tone, 
medium-dark skin tone #E13.1[1] (🧑🏼‍❤️‍💋‍🧑🏾)
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium-light skin tone, dark skin 
tone #E13.1[1] (🧑🏼‍❤️‍💋‍🧑🏿)
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F9D1 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium-light skin tone, light skin tone #E13.1[1] 
(🧑🏼‍❤️‍🧑🏻)
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F9D1 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium-light skin tone, medium skin tone #E13.1[1] 
(🧑🏼‍❤️‍🧑🏽)
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F9D1 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium-light skin tone, medium-dark skin tone 
#E13.1[1] (🧑🏼‍❤️‍🧑🏾)
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F9D1 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium-light skin tone, dark skin tone #E13.1[1] 
(🧑🏼‍❤️‍🧑🏿)
+1F9D1 1F3FC 200D 1F384                      ; RGI_Emoji_ZWJ_Sequence  ; mx 
claus: medium-light skin tone                               # E13.0  [1] (🧑🏼‍🎄)
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-light skin tone, light skin tone  # E12.0  [1] (🧑🏼‍🤝‍🧑🏻)
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-light skin tone                   # E12.0  [1] (🧑🏼‍🤝‍🧑🏼)
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-light skin tone, medium skin tone # E12.1  [1] (🧑🏼‍🤝‍🧑🏽)
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-light skin tone, medium-dark skin tone #E12.1[1] (🧑🏼‍🤝‍🧑🏾)
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-light skin tone, dark skin tone   # E12.1  [1] (🧑🏼‍🤝‍🧑🏿)
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium skin tone, light skin tone 
#E13.1  [1] (🧑🏽‍❤️‍💋‍🧑🏻)
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium skin tone, medium-light 
skin tone #E13.1[1] (🧑🏽‍❤️‍💋‍🧑🏼)
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium skin tone, medium-dark 
skin tone #E13.1[1] (🧑🏽‍❤️‍💋‍🧑🏾)
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium skin tone, dark skin tone 
# E13.1  [1] (🧑🏽‍❤️‍💋‍🧑🏿)
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F9D1 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium skin tone, light skin tone #E13.1[1] 
(🧑🏽‍❤️‍🧑🏻)
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F9D1 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium skin tone, medium-light skin tone #E13.1[1] 
(🧑🏽‍❤️‍🧑🏼)
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F9D1 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium skin tone, medium-dark skin tone #E13.1[1] 
(🧑🏽‍❤️‍🧑🏾)
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F9D1 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium skin tone, dark skin tone #E13.1[1] 
(🧑🏽‍❤️‍🧑🏿)
+1F9D1 1F3FD 200D 1F384                      ; RGI_Emoji_ZWJ_Sequence  ; mx 
claus: medium skin tone                                     # E13.0  [1] (🧑🏽‍🎄)
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium skin tone, light skin tone        # E12.0  [1] (🧑🏽‍🤝‍🧑🏻)
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium skin tone, medium-light skin tone # E12.0  [1] (🧑🏽‍🤝‍🧑🏼)
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium skin tone                         # E12.0  [1] (🧑🏽‍🤝‍🧑🏽)
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium skin tone, medium-dark skin tone  # E12.1  [1] (🧑🏽‍🤝‍🧑🏾)
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium skin tone, dark skin tone         # E12.1  [1] (🧑🏽‍🤝‍🧑🏿)
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium-dark skin tone, light skin 
tone #E13.1[1] (🧑🏾‍❤️‍💋‍🧑🏻)
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium-dark skin tone, 
medium-light skin tone #E13.1[1] (🧑🏾‍❤️‍💋‍🧑🏼)
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium-dark skin tone, medium 
skin tone #E13.1[1] (🧑🏾‍❤️‍💋‍🧑🏽)
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FF; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, medium-dark skin tone, dark skin 
tone #E13.1[1] (🧑🏾‍❤️‍💋‍🧑🏿)
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F9D1 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium-dark skin tone, light skin tone #E13.1[1] 
(🧑🏾‍❤️‍🧑🏻)
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F9D1 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium-dark skin tone, medium-light skin tone 
#E13.1[1] (🧑🏾‍❤️‍🧑🏼)
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F9D1 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium-dark skin tone, medium skin tone #E13.1[1] 
(🧑🏾‍❤️‍🧑🏽)
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F9D1 1F3FF ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, medium-dark skin tone, dark skin tone #E13.1[1] 
(🧑🏾‍❤️‍🧑🏿)
+1F9D1 1F3FE 200D 1F384                      ; RGI_Emoji_ZWJ_Sequence  ; mx 
claus: medium-dark skin tone                                # E13.0  [1] (🧑🏾‍🎄)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-dark skin tone, light skin tone   # E12.0  [1] (🧑🏾‍🤝‍🧑🏻)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-dark skin tone, medium-light skin tone #E12.0[1] (🧑🏾‍🤝‍🧑🏼)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-dark skin tone, medium skin tone  # E12.0  [1] (🧑🏾‍🤝‍🧑🏽)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-dark skin tone                    # E12.0  [1] (🧑🏾‍🤝‍🧑🏾)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: medium-dark skin tone, dark skin tone    # E12.1  [1] (🧑🏾‍🤝‍🧑🏿)
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FB; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, dark skin tone, light skin tone  
# E13.1  [1] (🧑🏿‍❤️‍💋‍🧑🏻)
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FC; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, dark skin tone, medium-light skin 
tone #E13.1[1] (🧑🏿‍❤️‍💋‍🧑🏼)
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FD; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, dark skin tone, medium skin tone 
# E13.1  [1] (🧑🏿‍❤️‍💋‍🧑🏽)
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FE; 
RGI_Emoji_ZWJ_Sequence; kiss: person, person, dark skin tone, medium-dark skin 
tone #E13.1[1] (🧑🏿‍❤️‍💋‍🧑🏾)
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F9D1 1F3FB ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, dark skin tone, light skin tone #E13.1[1] (🧑🏿‍❤️‍🧑🏻)
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F9D1 1F3FC ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, dark skin tone, medium-light skin tone #E13.1[1] 
(🧑🏿‍❤️‍🧑🏼)
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F9D1 1F3FD ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, dark skin tone, medium skin tone #E13.1[1] 
(🧑🏿‍❤️‍🧑🏽)
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F9D1 1F3FE ; RGI_Emoji_ZWJ_Sequence  ; couple 
with heart: person, person, dark skin tone, medium-dark skin tone #E13.1[1] 
(🧑🏿‍❤️‍🧑🏾)
+1F9D1 1F3FF 200D 1F384                      ; RGI_Emoji_ZWJ_Sequence  ; mx 
claus: dark skin tone                                       # E13.0  [1] (🧑🏿‍🎄)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FB     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: dark skin tone, light skin tone          # E12.0  [1] (🧑🏿‍🤝‍🧑🏻)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FC     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: dark skin tone, medium-light skin tone   # E12.0  [1] (🧑🏿‍🤝‍🧑🏼)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FD     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: dark skin tone, medium skin tone         # E12.0  [1] (🧑🏿‍🤝‍🧑🏽)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FE     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: dark skin tone, medium-dark skin tone    # E12.0  [1] (🧑🏿‍🤝‍🧑🏾)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FF     ; RGI_Emoji_ZWJ_Sequence  ; people 
holding hands: dark skin tone                           # E12.0  [1] (🧑🏿‍🤝‍🧑🏿)
+1FAF1 1F3FB 200D 1FAF2 1F3FC                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: light skin tone, medium-light skin tone             # E14.0  [1] 
(🫱🏻‍🫲🏼)
+1FAF1 1F3FB 200D 1FAF2 1F3FD                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: light skin tone, medium skin tone                   # E14.0  [1] 
(🫱🏻‍🫲🏽)
+1FAF1 1F3FB 200D 1FAF2 1F3FE                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: light skin tone, medium-dark skin tone              # E14.0  [1] 
(🫱🏻‍🫲🏾)
+1FAF1 1F3FB 200D 1FAF2 1F3FF                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: light skin tone, dark skin tone                     # E14.0  [1] 
(🫱🏻‍🫲🏿)
+1FAF1 1F3FC 200D 1FAF2 1F3FB                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium-light skin tone, light skin tone             # E14.0  [1] 
(🫱🏼‍🫲🏻)
+1FAF1 1F3FC 200D 1FAF2 1F3FD                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium-light skin tone, medium skin tone            # E14.0  [1] 
(🫱🏼‍🫲🏽)
+1FAF1 1F3FC 200D 1FAF2 1F3FE                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium-light skin tone, medium-dark skin tone       # E14.0  [1] 
(🫱🏼‍🫲🏾)
+1FAF1 1F3FC 200D 1FAF2 1F3FF                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium-light skin tone, dark skin tone              # E14.0  [1] 
(🫱🏼‍🫲🏿)
+1FAF1 1F3FD 200D 1FAF2 1F3FB                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium skin tone, light skin tone                   # E14.0  [1] 
(🫱🏽‍🫲🏻)
+1FAF1 1F3FD 200D 1FAF2 1F3FC                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium skin tone, medium-light skin tone            # E14.0  [1] 
(🫱🏽‍🫲🏼)
+1FAF1 1F3FD 200D 1FAF2 1F3FE                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium skin tone, medium-dark skin tone             # E14.0  [1] 
(🫱🏽‍🫲🏾)
+1FAF1 1F3FD 200D 1FAF2 1F3FF                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium skin tone, dark skin tone                    # E14.0  [1] 
(🫱🏽‍🫲🏿)
+1FAF1 1F3FE 200D 1FAF2 1F3FB                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium-dark skin tone, light skin tone              # E14.0  [1] 
(🫱🏾‍🫲🏻)
+1FAF1 1F3FE 200D 1FAF2 1F3FC                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium-dark skin tone, medium-light skin tone       # E14.0  [1] 
(🫱🏾‍🫲🏼)
+1FAF1 1F3FE 200D 1FAF2 1F3FD                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium-dark skin tone, medium skin tone             # E14.0  [1] 
(🫱🏾‍🫲🏽)
+1FAF1 1F3FE 200D 1FAF2 1F3FF                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: medium-dark skin tone, dark skin tone               # E14.0  [1] 
(🫱🏾‍🫲🏿)
+1FAF1 1F3FF 200D 1FAF2 1F3FB                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: dark skin tone, light skin tone                     # E14.0  [1] 
(🫱🏿‍🫲🏻)
+1FAF1 1F3FF 200D 1FAF2 1F3FC                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: dark skin tone, medium-light skin tone              # E14.0  [1] 
(🫱🏿‍🫲🏼)
+1FAF1 1F3FF 200D 1FAF2 1F3FD                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: dark skin tone, medium skin tone                    # E14.0  [1] 
(🫱🏿‍🫲🏽)
+1FAF1 1F3FF 200D 1FAF2 1F3FE                ; RGI_Emoji_ZWJ_Sequence  ; 
handshake: dark skin tone, medium-dark skin tone               # E14.0  [1] 
(🫱🏿‍🫲🏾)
+
+# Total elements: 332
+
+# ================================================
+
+# RGI_Emoji_ZWJ_Sequence: Role
+
+1F468 200D 2695 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
health worker                                              # E4.0   [1] (👨‍⚕️)
+1F468 200D 2696 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
judge                                                      # E4.0   [1] (👨‍⚖️)
+1F468 200D 2708 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
pilot                                                      # E4.0   [1] (👨‍✈️)
+1F468 200D 1F33E                            ; RGI_Emoji_ZWJ_Sequence  ; man 
farmer                                                     # E4.0   [1] (👨‍🌾)
+1F468 200D 1F373                            ; RGI_Emoji_ZWJ_Sequence  ; man 
cook                                                       # E4.0   [1] (👨‍🍳)
+1F468 200D 1F37C                            ; RGI_Emoji_ZWJ_Sequence  ; man 
feeding baby                                               # E13.0  [1] (👨‍🍼)
+1F468 200D 1F393                            ; RGI_Emoji_ZWJ_Sequence  ; man 
student                                                    # E4.0   [1] (👨‍🎓)
+1F468 200D 1F3A4                            ; RGI_Emoji_ZWJ_Sequence  ; man 
singer                                                     # E4.0   [1] (👨‍🎤)
+1F468 200D 1F3A8                            ; RGI_Emoji_ZWJ_Sequence  ; man 
artist                                                     # E4.0   [1] (👨‍🎨)
+1F468 200D 1F3EB                            ; RGI_Emoji_ZWJ_Sequence  ; man 
teacher                                                    # E4.0   [1] (👨‍🏫)
+1F468 200D 1F3ED                            ; RGI_Emoji_ZWJ_Sequence  ; man 
factory worker                                             # E4.0   [1] (👨‍🏭)
+1F468 200D 1F4BB                            ; RGI_Emoji_ZWJ_Sequence  ; man 
technologist                                               # E4.0   [1] (👨‍💻)
+1F468 200D 1F4BC                            ; RGI_Emoji_ZWJ_Sequence  ; man 
office worker                                              # E4.0   [1] (👨‍💼)
+1F468 200D 1F527                            ; RGI_Emoji_ZWJ_Sequence  ; man 
mechanic                                                   # E4.0   [1] (👨‍🔧)
+1F468 200D 1F52C                            ; RGI_Emoji_ZWJ_Sequence  ; man 
scientist                                                  # E4.0   [1] (👨‍🔬)
+1F468 200D 1F680                            ; RGI_Emoji_ZWJ_Sequence  ; man 
astronaut                                                  # E4.0   [1] (👨‍🚀)
+1F468 200D 1F692                            ; RGI_Emoji_ZWJ_Sequence  ; man 
firefighter                                                # E4.0   [1] (👨‍🚒)
+1F468 200D 1F9AF                            ; RGI_Emoji_ZWJ_Sequence  ; man 
with white cane                                            # E12.0  [1] (👨‍🦯)
+1F468 200D 1F9BC                            ; RGI_Emoji_ZWJ_Sequence  ; man in 
motorized wheelchair                                    # E12.0  [1] (👨‍🦼)
+1F468 200D 1F9BD                            ; RGI_Emoji_ZWJ_Sequence  ; man in 
manual wheelchair                                       # E12.0  [1] (👨‍🦽)
+1F468 1F3FB 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
health worker: light skin tone                             # E4.0   [1] (👨🏻‍⚕️)
+1F468 1F3FB 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
judge: light skin tone                                     # E4.0   [1] (👨🏻‍⚖️)
+1F468 1F3FB 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pilot: light skin tone                                     # E4.0   [1] (👨🏻‍✈️)
+1F468 1F3FB 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; man 
farmer: light skin tone                                    # E4.0   [1] (👨🏻‍🌾)
+1F468 1F3FB 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; man 
cook: light skin tone                                      # E4.0   [1] (👨🏻‍🍳)
+1F468 1F3FB 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
feeding baby: light skin tone                              # E13.0  [1] (👨🏻‍🍼)
+1F468 1F3FB 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; man 
student: light skin tone                                   # E4.0   [1] (👨🏻‍🎓)
+1F468 1F3FB 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; man 
singer: light skin tone                                    # E4.0   [1] (👨🏻‍🎤)
+1F468 1F3FB 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; man 
artist: light skin tone                                    # E4.0   [1] (👨🏻‍🎨)
+1F468 1F3FB 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
teacher: light skin tone                                   # E4.0   [1] (👨🏻‍🏫)
+1F468 1F3FB 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; man 
factory worker: light skin tone                            # E4.0   [1] (👨🏻‍🏭)
+1F468 1F3FB 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
technologist: light skin tone                              # E4.0   [1] (👨🏻‍💻)
+1F468 1F3FB 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; man 
office worker: light skin tone                             # E4.0   [1] (👨🏻‍💼)
+1F468 1F3FB 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; man 
mechanic: light skin tone                                  # E4.0   [1] (👨🏻‍🔧)
+1F468 1F3FB 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
scientist: light skin tone                                 # E4.0   [1] (👨🏻‍🔬)
+1F468 1F3FB 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; man 
astronaut: light skin tone                                 # E4.0   [1] (👨🏻‍🚀)
+1F468 1F3FB 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; man 
firefighter: light skin tone                               # E4.0   [1] (👨🏻‍🚒)
+1F468 1F3FB 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; man 
with white cane: light skin tone                           # E12.0  [1] (👨🏻‍🦯)
+1F468 1F3FB 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
motorized wheelchair: light skin tone                   # E12.0  [1] (👨🏻‍🦼)
+1F468 1F3FB 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
manual wheelchair: light skin tone                      # E12.0  [1] (👨🏻‍🦽)
+1F468 1F3FC 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
health worker: medium-light skin tone                      # E4.0   [1] (👨🏼‍⚕️)
+1F468 1F3FC 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
judge: medium-light skin tone                              # E4.0   [1] (👨🏼‍⚖️)
+1F468 1F3FC 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pilot: medium-light skin tone                              # E4.0   [1] (👨🏼‍✈️)
+1F468 1F3FC 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; man 
farmer: medium-light skin tone                             # E4.0   [1] (👨🏼‍🌾)
+1F468 1F3FC 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; man 
cook: medium-light skin tone                               # E4.0   [1] (👨🏼‍🍳)
+1F468 1F3FC 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
feeding baby: medium-light skin tone                       # E13.0  [1] (👨🏼‍🍼)
+1F468 1F3FC 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; man 
student: medium-light skin tone                            # E4.0   [1] (👨🏼‍🎓)
+1F468 1F3FC 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; man 
singer: medium-light skin tone                             # E4.0   [1] (👨🏼‍🎤)
+1F468 1F3FC 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; man 
artist: medium-light skin tone                             # E4.0   [1] (👨🏼‍🎨)
+1F468 1F3FC 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
teacher: medium-light skin tone                            # E4.0   [1] (👨🏼‍🏫)
+1F468 1F3FC 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; man 
factory worker: medium-light skin tone                     # E4.0   [1] (👨🏼‍🏭)
+1F468 1F3FC 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
technologist: medium-light skin tone                       # E4.0   [1] (👨🏼‍💻)
+1F468 1F3FC 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; man 
office worker: medium-light skin tone                      # E4.0   [1] (👨🏼‍💼)
+1F468 1F3FC 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; man 
mechanic: medium-light skin tone                           # E4.0   [1] (👨🏼‍🔧)
+1F468 1F3FC 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
scientist: medium-light skin tone                          # E4.0   [1] (👨🏼‍🔬)
+1F468 1F3FC 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; man 
astronaut: medium-light skin tone                          # E4.0   [1] (👨🏼‍🚀)
+1F468 1F3FC 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; man 
firefighter: medium-light skin tone                        # E4.0   [1] (👨🏼‍🚒)
+1F468 1F3FC 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; man 
with white cane: medium-light skin tone                    # E12.0  [1] (👨🏼‍🦯)
+1F468 1F3FC 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
motorized wheelchair: medium-light skin tone            # E12.0  [1] (👨🏼‍🦼)
+1F468 1F3FC 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
manual wheelchair: medium-light skin tone               # E12.0  [1] (👨🏼‍🦽)
+1F468 1F3FD 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
health worker: medium skin tone                            # E4.0   [1] (👨🏽‍⚕️)
+1F468 1F3FD 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
judge: medium skin tone                                    # E4.0   [1] (👨🏽‍⚖️)
+1F468 1F3FD 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pilot: medium skin tone                                    # E4.0   [1] (👨🏽‍✈️)
+1F468 1F3FD 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; man 
farmer: medium skin tone                                   # E4.0   [1] (👨🏽‍🌾)
+1F468 1F3FD 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; man 
cook: medium skin tone                                     # E4.0   [1] (👨🏽‍🍳)
+1F468 1F3FD 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
feeding baby: medium skin tone                             # E13.0  [1] (👨🏽‍🍼)
+1F468 1F3FD 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; man 
student: medium skin tone                                  # E4.0   [1] (👨🏽‍🎓)
+1F468 1F3FD 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; man 
singer: medium skin tone                                   # E4.0   [1] (👨🏽‍🎤)
+1F468 1F3FD 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; man 
artist: medium skin tone                                   # E4.0   [1] (👨🏽‍🎨)
+1F468 1F3FD 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
teacher: medium skin tone                                  # E4.0   [1] (👨🏽‍🏫)
+1F468 1F3FD 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; man 
factory worker: medium skin tone                           # E4.0   [1] (👨🏽‍🏭)
+1F468 1F3FD 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
technologist: medium skin tone                             # E4.0   [1] (👨🏽‍💻)
+1F468 1F3FD 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; man 
office worker: medium skin tone                            # E4.0   [1] (👨🏽‍💼)
+1F468 1F3FD 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; man 
mechanic: medium skin tone                                 # E4.0   [1] (👨🏽‍🔧)
+1F468 1F3FD 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
scientist: medium skin tone                                # E4.0   [1] (👨🏽‍🔬)
+1F468 1F3FD 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; man 
astronaut: medium skin tone                                # E4.0   [1] (👨🏽‍🚀)
+1F468 1F3FD 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; man 
firefighter: medium skin tone                              # E4.0   [1] (👨🏽‍🚒)
+1F468 1F3FD 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; man 
with white cane: medium skin tone                          # E12.0  [1] (👨🏽‍🦯)
+1F468 1F3FD 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
motorized wheelchair: medium skin tone                  # E12.0  [1] (👨🏽‍🦼)
+1F468 1F3FD 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
manual wheelchair: medium skin tone                     # E12.0  [1] (👨🏽‍🦽)
+1F468 1F3FE 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
health worker: medium-dark skin tone                       # E4.0   [1] (👨🏾‍⚕️)
+1F468 1F3FE 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
judge: medium-dark skin tone                               # E4.0   [1] (👨🏾‍⚖️)
+1F468 1F3FE 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pilot: medium-dark skin tone                               # E4.0   [1] (👨🏾‍✈️)
+1F468 1F3FE 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; man 
farmer: medium-dark skin tone                              # E4.0   [1] (👨🏾‍🌾)
+1F468 1F3FE 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; man 
cook: medium-dark skin tone                                # E4.0   [1] (👨🏾‍🍳)
+1F468 1F3FE 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
feeding baby: medium-dark skin tone                        # E13.0  [1] (👨🏾‍🍼)
+1F468 1F3FE 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; man 
student: medium-dark skin tone                             # E4.0   [1] (👨🏾‍🎓)
+1F468 1F3FE 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; man 
singer: medium-dark skin tone                              # E4.0   [1] (👨🏾‍🎤)
+1F468 1F3FE 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; man 
artist: medium-dark skin tone                              # E4.0   [1] (👨🏾‍🎨)
+1F468 1F3FE 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
teacher: medium-dark skin tone                             # E4.0   [1] (👨🏾‍🏫)
+1F468 1F3FE 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; man 
factory worker: medium-dark skin tone                      # E4.0   [1] (👨🏾‍🏭)
+1F468 1F3FE 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
technologist: medium-dark skin tone                        # E4.0   [1] (👨🏾‍💻)
+1F468 1F3FE 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; man 
office worker: medium-dark skin tone                       # E4.0   [1] (👨🏾‍💼)
+1F468 1F3FE 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; man 
mechanic: medium-dark skin tone                            # E4.0   [1] (👨🏾‍🔧)
+1F468 1F3FE 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
scientist: medium-dark skin tone                           # E4.0   [1] (👨🏾‍🔬)
+1F468 1F3FE 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; man 
astronaut: medium-dark skin tone                           # E4.0   [1] (👨🏾‍🚀)
+1F468 1F3FE 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; man 
firefighter: medium-dark skin tone                         # E4.0   [1] (👨🏾‍🚒)
+1F468 1F3FE 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; man 
with white cane: medium-dark skin tone                     # E12.0  [1] (👨🏾‍🦯)
+1F468 1F3FE 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
motorized wheelchair: medium-dark skin tone             # E12.0  [1] (👨🏾‍🦼)
+1F468 1F3FE 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
manual wheelchair: medium-dark skin tone                # E12.0  [1] (👨🏾‍🦽)
+1F468 1F3FF 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
health worker: dark skin tone                              # E4.0   [1] (👨🏿‍⚕️)
+1F468 1F3FF 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
judge: dark skin tone                                      # E4.0   [1] (👨🏿‍⚖️)
+1F468 1F3FF 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pilot: dark skin tone                                      # E4.0   [1] (👨🏿‍✈️)
+1F468 1F3FF 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; man 
farmer: dark skin tone                                     # E4.0   [1] (👨🏿‍🌾)
+1F468 1F3FF 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; man 
cook: dark skin tone                                       # E4.0   [1] (👨🏿‍🍳)
+1F468 1F3FF 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
feeding baby: dark skin tone                               # E13.0  [1] (👨🏿‍🍼)
+1F468 1F3FF 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; man 
student: dark skin tone                                    # E4.0   [1] (👨🏿‍🎓)
+1F468 1F3FF 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; man 
singer: dark skin tone                                     # E4.0   [1] (👨🏿‍🎤)
+1F468 1F3FF 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; man 
artist: dark skin tone                                     # E4.0   [1] (👨🏿‍🎨)
+1F468 1F3FF 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
teacher: dark skin tone                                    # E4.0   [1] (👨🏿‍🏫)
+1F468 1F3FF 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; man 
factory worker: dark skin tone                             # E4.0   [1] (👨🏿‍🏭)
+1F468 1F3FF 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; man 
technologist: dark skin tone                               # E4.0   [1] (👨🏿‍💻)
+1F468 1F3FF 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; man 
office worker: dark skin tone                              # E4.0   [1] (👨🏿‍💼)
+1F468 1F3FF 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; man 
mechanic: dark skin tone                                   # E4.0   [1] (👨🏿‍🔧)
+1F468 1F3FF 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; man 
scientist: dark skin tone                                  # E4.0   [1] (👨🏿‍🔬)
+1F468 1F3FF 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; man 
astronaut: dark skin tone                                  # E4.0   [1] (👨🏿‍🚀)
+1F468 1F3FF 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; man 
firefighter: dark skin tone                                # E4.0   [1] (👨🏿‍🚒)
+1F468 1F3FF 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; man 
with white cane: dark skin tone                            # E12.0  [1] (👨🏿‍🦯)
+1F468 1F3FF 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
motorized wheelchair: dark skin tone                    # E12.0  [1] (👨🏿‍🦼)
+1F468 1F3FF 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; man in 
manual wheelchair: dark skin tone                       # E12.0  [1] (👨🏿‍🦽)
+1F469 200D 2695 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
health worker                                            # E4.0   [1] (👩‍⚕️)
+1F469 200D 2696 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
judge                                                    # E4.0   [1] (👩‍⚖️)
+1F469 200D 2708 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
pilot                                                    # E4.0   [1] (👩‍✈️)
+1F469 200D 1F33E                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
farmer                                                   # E4.0   [1] (👩‍🌾)
+1F469 200D 1F373                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
cook                                                     # E4.0   [1] (👩‍🍳)
+1F469 200D 1F37C                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
feeding baby                                             # E13.0  [1] (👩‍🍼)
+1F469 200D 1F393                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
student                                                  # E4.0   [1] (👩‍🎓)
+1F469 200D 1F3A4                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
singer                                                   # E4.0   [1] (👩‍🎤)
+1F469 200D 1F3A8                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
artist                                                   # E4.0   [1] (👩‍🎨)
+1F469 200D 1F3EB                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
teacher                                                  # E4.0   [1] (👩‍🏫)
+1F469 200D 1F3ED                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
factory worker                                           # E4.0   [1] (👩‍🏭)
+1F469 200D 1F4BB                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
technologist                                             # E4.0   [1] (👩‍💻)
+1F469 200D 1F4BC                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
office worker                                            # E4.0   [1] (👩‍💼)
+1F469 200D 1F527                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
mechanic                                                 # E4.0   [1] (👩‍🔧)
+1F469 200D 1F52C                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
scientist                                                # E4.0   [1] (👩‍🔬)
+1F469 200D 1F680                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
astronaut                                                # E4.0   [1] (👩‍🚀)
+1F469 200D 1F692                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
firefighter                                              # E4.0   [1] (👩‍🚒)
+1F469 200D 1F9AF                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
with white cane                                          # E12.0  [1] (👩‍🦯)
+1F469 200D 1F9BC                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
in motorized wheelchair                                  # E12.0  [1] (👩‍🦼)
+1F469 200D 1F9BD                            ; RGI_Emoji_ZWJ_Sequence  ; woman 
in manual wheelchair                                     # E12.0  [1] (👩‍🦽)
+1F469 1F3FB 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
health worker: light skin tone                           # E4.0   [1] (👩🏻‍⚕️)
+1F469 1F3FB 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
judge: light skin tone                                   # E4.0   [1] (👩🏻‍⚖️)
+1F469 1F3FB 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pilot: light skin tone                                   # E4.0   [1] (👩🏻‍✈️)
+1F469 1F3FB 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
farmer: light skin tone                                  # E4.0   [1] (👩🏻‍🌾)
+1F469 1F3FB 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
cook: light skin tone                                    # E4.0   [1] (👩🏻‍🍳)
+1F469 1F3FB 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
feeding baby: light skin tone                            # E13.0  [1] (👩🏻‍🍼)
+1F469 1F3FB 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
student: light skin tone                                 # E4.0   [1] (👩🏻‍🎓)
+1F469 1F3FB 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
singer: light skin tone                                  # E4.0   [1] (👩🏻‍🎤)
+1F469 1F3FB 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
artist: light skin tone                                  # E4.0   [1] (👩🏻‍🎨)
+1F469 1F3FB 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
teacher: light skin tone                                 # E4.0   [1] (👩🏻‍🏫)
+1F469 1F3FB 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
factory worker: light skin tone                          # E4.0   [1] (👩🏻‍🏭)
+1F469 1F3FB 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
technologist: light skin tone                            # E4.0   [1] (👩🏻‍💻)
+1F469 1F3FB 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
office worker: light skin tone                           # E4.0   [1] (👩🏻‍💼)
+1F469 1F3FB 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
mechanic: light skin tone                                # E4.0   [1] (👩🏻‍🔧)
+1F469 1F3FB 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
scientist: light skin tone                               # E4.0   [1] (👩🏻‍🔬)
+1F469 1F3FB 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
astronaut: light skin tone                               # E4.0   [1] (👩🏻‍🚀)
+1F469 1F3FB 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
firefighter: light skin tone                             # E4.0   [1] (👩🏻‍🚒)
+1F469 1F3FB 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
with white cane: light skin tone                         # E12.0  [1] (👩🏻‍🦯)
+1F469 1F3FB 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in motorized wheelchair: light skin tone                 # E12.0  [1] (👩🏻‍🦼)
+1F469 1F3FB 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in manual wheelchair: light skin tone                    # E12.0  [1] (👩🏻‍🦽)
+1F469 1F3FC 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
health worker: medium-light skin tone                    # E4.0   [1] (👩🏼‍⚕️)
+1F469 1F3FC 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
judge: medium-light skin tone                            # E4.0   [1] (👩🏼‍⚖️)
+1F469 1F3FC 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pilot: medium-light skin tone                            # E4.0   [1] (👩🏼‍✈️)
+1F469 1F3FC 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
farmer: medium-light skin tone                           # E4.0   [1] (👩🏼‍🌾)
+1F469 1F3FC 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
cook: medium-light skin tone                             # E4.0   [1] (👩🏼‍🍳)
+1F469 1F3FC 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
feeding baby: medium-light skin tone                     # E13.0  [1] (👩🏼‍🍼)
+1F469 1F3FC 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
student: medium-light skin tone                          # E4.0   [1] (👩🏼‍🎓)
+1F469 1F3FC 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
singer: medium-light skin tone                           # E4.0   [1] (👩🏼‍🎤)
+1F469 1F3FC 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
artist: medium-light skin tone                           # E4.0   [1] (👩🏼‍🎨)
+1F469 1F3FC 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
teacher: medium-light skin tone                          # E4.0   [1] (👩🏼‍🏫)
+1F469 1F3FC 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
factory worker: medium-light skin tone                   # E4.0   [1] (👩🏼‍🏭)
+1F469 1F3FC 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
technologist: medium-light skin tone                     # E4.0   [1] (👩🏼‍💻)
+1F469 1F3FC 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
office worker: medium-light skin tone                    # E4.0   [1] (👩🏼‍💼)
+1F469 1F3FC 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
mechanic: medium-light skin tone                         # E4.0   [1] (👩🏼‍🔧)
+1F469 1F3FC 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
scientist: medium-light skin tone                        # E4.0   [1] (👩🏼‍🔬)
+1F469 1F3FC 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
astronaut: medium-light skin tone                        # E4.0   [1] (👩🏼‍🚀)
+1F469 1F3FC 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
firefighter: medium-light skin tone                      # E4.0   [1] (👩🏼‍🚒)
+1F469 1F3FC 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
with white cane: medium-light skin tone                  # E12.0  [1] (👩🏼‍🦯)
+1F469 1F3FC 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in motorized wheelchair: medium-light skin tone          # E12.0  [1] (👩🏼‍🦼)
+1F469 1F3FC 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in manual wheelchair: medium-light skin tone             # E12.0  [1] (👩🏼‍🦽)
+1F469 1F3FD 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
health worker: medium skin tone                          # E4.0   [1] (👩🏽‍⚕️)
+1F469 1F3FD 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
judge: medium skin tone                                  # E4.0   [1] (👩🏽‍⚖️)
+1F469 1F3FD 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pilot: medium skin tone                                  # E4.0   [1] (👩🏽‍✈️)
+1F469 1F3FD 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
farmer: medium skin tone                                 # E4.0   [1] (👩🏽‍🌾)
+1F469 1F3FD 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
cook: medium skin tone                                   # E4.0   [1] (👩🏽‍🍳)
+1F469 1F3FD 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
feeding baby: medium skin tone                           # E13.0  [1] (👩🏽‍🍼)
+1F469 1F3FD 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
student: medium skin tone                                # E4.0   [1] (👩🏽‍🎓)
+1F469 1F3FD 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
singer: medium skin tone                                 # E4.0   [1] (👩🏽‍🎤)
+1F469 1F3FD 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
artist: medium skin tone                                 # E4.0   [1] (👩🏽‍🎨)
+1F469 1F3FD 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
teacher: medium skin tone                                # E4.0   [1] (👩🏽‍🏫)
+1F469 1F3FD 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
factory worker: medium skin tone                         # E4.0   [1] (👩🏽‍🏭)
+1F469 1F3FD 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
technologist: medium skin tone                           # E4.0   [1] (👩🏽‍💻)
+1F469 1F3FD 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
office worker: medium skin tone                          # E4.0   [1] (👩🏽‍💼)
+1F469 1F3FD 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
mechanic: medium skin tone                               # E4.0   [1] (👩🏽‍🔧)
+1F469 1F3FD 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
scientist: medium skin tone                              # E4.0   [1] (👩🏽‍🔬)
+1F469 1F3FD 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
astronaut: medium skin tone                              # E4.0   [1] (👩🏽‍🚀)
+1F469 1F3FD 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
firefighter: medium skin tone                            # E4.0   [1] (👩🏽‍🚒)
+1F469 1F3FD 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
with white cane: medium skin tone                        # E12.0  [1] (👩🏽‍🦯)
+1F469 1F3FD 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in motorized wheelchair: medium skin tone                # E12.0  [1] (👩🏽‍🦼)
+1F469 1F3FD 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in manual wheelchair: medium skin tone                   # E12.0  [1] (👩🏽‍🦽)
+1F469 1F3FE 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
health worker: medium-dark skin tone                     # E4.0   [1] (👩🏾‍⚕️)
+1F469 1F3FE 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
judge: medium-dark skin tone                             # E4.0   [1] (👩🏾‍⚖️)
+1F469 1F3FE 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pilot: medium-dark skin tone                             # E4.0   [1] (👩🏾‍✈️)
+1F469 1F3FE 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
farmer: medium-dark skin tone                            # E4.0   [1] (👩🏾‍🌾)
+1F469 1F3FE 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
cook: medium-dark skin tone                              # E4.0   [1] (👩🏾‍🍳)
+1F469 1F3FE 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
feeding baby: medium-dark skin tone                      # E13.0  [1] (👩🏾‍🍼)
+1F469 1F3FE 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
student: medium-dark skin tone                           # E4.0   [1] (👩🏾‍🎓)
+1F469 1F3FE 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
singer: medium-dark skin tone                            # E4.0   [1] (👩🏾‍🎤)
+1F469 1F3FE 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
artist: medium-dark skin tone                            # E4.0   [1] (👩🏾‍🎨)
+1F469 1F3FE 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
teacher: medium-dark skin tone                           # E4.0   [1] (👩🏾‍🏫)
+1F469 1F3FE 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
factory worker: medium-dark skin tone                    # E4.0   [1] (👩🏾‍🏭)
+1F469 1F3FE 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
technologist: medium-dark skin tone                      # E4.0   [1] (👩🏾‍💻)
+1F469 1F3FE 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
office worker: medium-dark skin tone                     # E4.0   [1] (👩🏾‍💼)
+1F469 1F3FE 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
mechanic: medium-dark skin tone                          # E4.0   [1] (👩🏾‍🔧)
+1F469 1F3FE 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
scientist: medium-dark skin tone                         # E4.0   [1] (👩🏾‍🔬)
+1F469 1F3FE 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
astronaut: medium-dark skin tone                         # E4.0   [1] (👩🏾‍🚀)
+1F469 1F3FE 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
firefighter: medium-dark skin tone                       # E4.0   [1] (👩🏾‍🚒)
+1F469 1F3FE 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
with white cane: medium-dark skin tone                   # E12.0  [1] (👩🏾‍🦯)
+1F469 1F3FE 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in motorized wheelchair: medium-dark skin tone           # E12.0  [1] (👩🏾‍🦼)
+1F469 1F3FE 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in manual wheelchair: medium-dark skin tone              # E12.0  [1] (👩🏾‍🦽)
+1F469 1F3FF 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
health worker: dark skin tone                            # E4.0   [1] (👩🏿‍⚕️)
+1F469 1F3FF 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
judge: dark skin tone                                    # E4.0   [1] (👩🏿‍⚖️)
+1F469 1F3FF 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pilot: dark skin tone                                    # E4.0   [1] (👩🏿‍✈️)
+1F469 1F3FF 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
farmer: dark skin tone                                   # E4.0   [1] (👩🏿‍🌾)
+1F469 1F3FF 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
cook: dark skin tone                                     # E4.0   [1] (👩🏿‍🍳)
+1F469 1F3FF 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
feeding baby: dark skin tone                             # E13.0  [1] (👩🏿‍🍼)
+1F469 1F3FF 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
student: dark skin tone                                  # E4.0   [1] (👩🏿‍🎓)
+1F469 1F3FF 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
singer: dark skin tone                                   # E4.0   [1] (👩🏿‍🎤)
+1F469 1F3FF 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
artist: dark skin tone                                   # E4.0   [1] (👩🏿‍🎨)
+1F469 1F3FF 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
teacher: dark skin tone                                  # E4.0   [1] (👩🏿‍🏫)
+1F469 1F3FF 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
factory worker: dark skin tone                           # E4.0   [1] (👩🏿‍🏭)
+1F469 1F3FF 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
technologist: dark skin tone                             # E4.0   [1] (👩🏿‍💻)
+1F469 1F3FF 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
office worker: dark skin tone                            # E4.0   [1] (👩🏿‍💼)
+1F469 1F3FF 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
mechanic: dark skin tone                                 # E4.0   [1] (👩🏿‍🔧)
+1F469 1F3FF 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
scientist: dark skin tone                                # E4.0   [1] (👩🏿‍🔬)
+1F469 1F3FF 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
astronaut: dark skin tone                                # E4.0   [1] (👩🏿‍🚀)
+1F469 1F3FF 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
firefighter: dark skin tone                              # E4.0   [1] (👩🏿‍🚒)
+1F469 1F3FF 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
with white cane: dark skin tone                          # E12.0  [1] (👩🏿‍🦯)
+1F469 1F3FF 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in motorized wheelchair: dark skin tone                  # E12.0  [1] (👩🏿‍🦼)
+1F469 1F3FF 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; woman 
in manual wheelchair: dark skin tone                     # E12.0  [1] (👩🏿‍🦽)
+1F9D1 200D 2695 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; health 
worker                                                  # E12.1  [1] (🧑‍⚕️)
+1F9D1 200D 2696 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; judge  
                                                        # E12.1  [1] (🧑‍⚖️)
+1F9D1 200D 2708 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; pilot  
                                                        # E12.1  [1] (🧑‍✈️)
+1F9D1 200D 1F33E                            ; RGI_Emoji_ZWJ_Sequence  ; farmer 
                                                        # E12.1  [1] (🧑‍🌾)
+1F9D1 200D 1F373                            ; RGI_Emoji_ZWJ_Sequence  ; cook   
                                                        # E12.1  [1] (🧑‍🍳)
+1F9D1 200D 1F37C                            ; RGI_Emoji_ZWJ_Sequence  ; person 
feeding baby                                            # E13.0  [1] (🧑‍🍼)
+1F9D1 200D 1F393                            ; RGI_Emoji_ZWJ_Sequence  ; 
student                                                        # E12.1  [1] 
(🧑‍🎓)
+1F9D1 200D 1F3A4                            ; RGI_Emoji_ZWJ_Sequence  ; singer 
                                                        # E12.1  [1] (🧑‍🎤)
+1F9D1 200D 1F3A8                            ; RGI_Emoji_ZWJ_Sequence  ; artist 
                                                        # E12.1  [1] (🧑‍🎨)
+1F9D1 200D 1F3EB                            ; RGI_Emoji_ZWJ_Sequence  ; 
teacher                                                        # E12.1  [1] 
(🧑‍🏫)
+1F9D1 200D 1F3ED                            ; RGI_Emoji_ZWJ_Sequence  ; 
factory worker                                                 # E12.1  [1] 
(🧑‍🏭)
+1F9D1 200D 1F4BB                            ; RGI_Emoji_ZWJ_Sequence  ; 
technologist                                                   # E12.1  [1] 
(🧑‍💻)
+1F9D1 200D 1F4BC                            ; RGI_Emoji_ZWJ_Sequence  ; office 
worker                                                  # E12.1  [1] (🧑‍💼)
+1F9D1 200D 1F527                            ; RGI_Emoji_ZWJ_Sequence  ; 
mechanic                                                       # E12.1  [1] 
(🧑‍🔧)
+1F9D1 200D 1F52C                            ; RGI_Emoji_ZWJ_Sequence  ; 
scientist                                                      # E12.1  [1] 
(🧑‍🔬)
+1F9D1 200D 1F680                            ; RGI_Emoji_ZWJ_Sequence  ; 
astronaut                                                      # E12.1  [1] 
(🧑‍🚀)
+1F9D1 200D 1F692                            ; RGI_Emoji_ZWJ_Sequence  ; 
firefighter                                                    # E12.1  [1] 
(🧑‍🚒)
+1F9D1 200D 1F9AF                            ; RGI_Emoji_ZWJ_Sequence  ; person 
with white cane                                         # E12.1  [1] (🧑‍🦯)
+1F9D1 200D 1F9BC                            ; RGI_Emoji_ZWJ_Sequence  ; person 
in motorized wheelchair                                 # E12.1  [1] (🧑‍🦼)
+1F9D1 200D 1F9BD                            ; RGI_Emoji_ZWJ_Sequence  ; person 
in manual wheelchair                                    # E12.1  [1] (🧑‍🦽)
+1F9D1 1F3FB 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; health 
worker: light skin tone                                 # E12.1  [1] (🧑🏻‍⚕️)
+1F9D1 1F3FB 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; judge: 
light skin tone                                         # E12.1  [1] (🧑🏻‍⚖️)
+1F9D1 1F3FB 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; pilot: 
light skin tone                                         # E12.1  [1] (🧑🏻‍✈️)
+1F9D1 1F3FB 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; 
farmer: light skin tone                                        # E12.1  [1] 
(🧑🏻‍🌾)
+1F9D1 1F3FB 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; cook: 
light skin tone                                          # E12.1  [1] (🧑🏻‍🍳)
+1F9D1 1F3FB 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; person 
feeding baby: light skin tone                           # E13.0  [1] (🧑🏻‍🍼)
+1F9D1 1F3FB 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; 
student: light skin tone                                       # E12.1  [1] 
(🧑🏻‍🎓)
+1F9D1 1F3FB 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; 
singer: light skin tone                                        # E12.1  [1] 
(🧑🏻‍🎤)
+1F9D1 1F3FB 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; 
artist: light skin tone                                        # E12.1  [1] 
(🧑🏻‍🎨)
+1F9D1 1F3FB 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; 
teacher: light skin tone                                       # E12.1  [1] 
(🧑🏻‍🏫)
+1F9D1 1F3FB 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; 
factory worker: light skin tone                                # E12.1  [1] 
(🧑🏻‍🏭)
+1F9D1 1F3FB 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; 
technologist: light skin tone                                  # E12.1  [1] 
(🧑🏻‍💻)
+1F9D1 1F3FB 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; office 
worker: light skin tone                                 # E12.1  [1] (🧑🏻‍💼)
+1F9D1 1F3FB 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; 
mechanic: light skin tone                                      # E12.1  [1] 
(🧑🏻‍🔧)
+1F9D1 1F3FB 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; 
scientist: light skin tone                                     # E12.1  [1] 
(🧑🏻‍🔬)
+1F9D1 1F3FB 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; 
astronaut: light skin tone                                     # E12.1  [1] 
(🧑🏻‍🚀)
+1F9D1 1F3FB 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; 
firefighter: light skin tone                                   # E12.1  [1] 
(🧑🏻‍🚒)
+1F9D1 1F3FB 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; person 
with white cane: light skin tone                        # E12.1  [1] (🧑🏻‍🦯)
+1F9D1 1F3FB 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in motorized wheelchair: light skin tone                # E12.1  [1] (🧑🏻‍🦼)
+1F9D1 1F3FB 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in manual wheelchair: light skin tone                   # E12.1  [1] (🧑🏻‍🦽)
+1F9D1 1F3FC 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; health 
worker: medium-light skin tone                          # E12.1  [1] (🧑🏼‍⚕️)
+1F9D1 1F3FC 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; judge: 
medium-light skin tone                                  # E12.1  [1] (🧑🏼‍⚖️)
+1F9D1 1F3FC 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; pilot: 
medium-light skin tone                                  # E12.1  [1] (🧑🏼‍✈️)
+1F9D1 1F3FC 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; 
farmer: medium-light skin tone                                 # E12.1  [1] 
(🧑🏼‍🌾)
+1F9D1 1F3FC 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; cook: 
medium-light skin tone                                   # E12.1  [1] (🧑🏼‍🍳)
+1F9D1 1F3FC 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; person 
feeding baby: medium-light skin tone                    # E13.0  [1] (🧑🏼‍🍼)
+1F9D1 1F3FC 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; 
student: medium-light skin tone                                # E12.1  [1] 
(🧑🏼‍🎓)
+1F9D1 1F3FC 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; 
singer: medium-light skin tone                                 # E12.1  [1] 
(🧑🏼‍🎤)
+1F9D1 1F3FC 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; 
artist: medium-light skin tone                                 # E12.1  [1] 
(🧑🏼‍🎨)
+1F9D1 1F3FC 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; 
teacher: medium-light skin tone                                # E12.1  [1] 
(🧑🏼‍🏫)
+1F9D1 1F3FC 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; 
factory worker: medium-light skin tone                         # E12.1  [1] 
(🧑🏼‍🏭)
+1F9D1 1F3FC 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; 
technologist: medium-light skin tone                           # E12.1  [1] 
(🧑🏼‍💻)
+1F9D1 1F3FC 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; office 
worker: medium-light skin tone                          # E12.1  [1] (🧑🏼‍💼)
+1F9D1 1F3FC 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; 
mechanic: medium-light skin tone                               # E12.1  [1] 
(🧑🏼‍🔧)
+1F9D1 1F3FC 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; 
scientist: medium-light skin tone                              # E12.1  [1] 
(🧑🏼‍🔬)
+1F9D1 1F3FC 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; 
astronaut: medium-light skin tone                              # E12.1  [1] 
(🧑🏼‍🚀)
+1F9D1 1F3FC 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; 
firefighter: medium-light skin tone                            # E12.1  [1] 
(🧑🏼‍🚒)
+1F9D1 1F3FC 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; person 
with white cane: medium-light skin tone                 # E12.1  [1] (🧑🏼‍🦯)
+1F9D1 1F3FC 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in motorized wheelchair: medium-light skin tone         # E12.1  [1] (🧑🏼‍🦼)
+1F9D1 1F3FC 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in manual wheelchair: medium-light skin tone            # E12.1  [1] (🧑🏼‍🦽)
+1F9D1 1F3FD 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; health 
worker: medium skin tone                                # E12.1  [1] (🧑🏽‍⚕️)
+1F9D1 1F3FD 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; judge: 
medium skin tone                                        # E12.1  [1] (🧑🏽‍⚖️)
+1F9D1 1F3FD 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; pilot: 
medium skin tone                                        # E12.1  [1] (🧑🏽‍✈️)
+1F9D1 1F3FD 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; 
farmer: medium skin tone                                       # E12.1  [1] 
(🧑🏽‍🌾)
+1F9D1 1F3FD 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; cook: 
medium skin tone                                         # E12.1  [1] (🧑🏽‍🍳)
+1F9D1 1F3FD 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; person 
feeding baby: medium skin tone                          # E13.0  [1] (🧑🏽‍🍼)
+1F9D1 1F3FD 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; 
student: medium skin tone                                      # E12.1  [1] 
(🧑🏽‍🎓)
+1F9D1 1F3FD 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; 
singer: medium skin tone                                       # E12.1  [1] 
(🧑🏽‍🎤)
+1F9D1 1F3FD 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; 
artist: medium skin tone                                       # E12.1  [1] 
(🧑🏽‍🎨)
+1F9D1 1F3FD 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; 
teacher: medium skin tone                                      # E12.1  [1] 
(🧑🏽‍🏫)
+1F9D1 1F3FD 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; 
factory worker: medium skin tone                               # E12.1  [1] 
(🧑🏽‍🏭)
+1F9D1 1F3FD 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; 
technologist: medium skin tone                                 # E12.1  [1] 
(🧑🏽‍💻)
+1F9D1 1F3FD 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; office 
worker: medium skin tone                                # E12.1  [1] (🧑🏽‍💼)
+1F9D1 1F3FD 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; 
mechanic: medium skin tone                                     # E12.1  [1] 
(🧑🏽‍🔧)
+1F9D1 1F3FD 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; 
scientist: medium skin tone                                    # E12.1  [1] 
(🧑🏽‍🔬)
+1F9D1 1F3FD 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; 
astronaut: medium skin tone                                    # E12.1  [1] 
(🧑🏽‍🚀)
+1F9D1 1F3FD 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; 
firefighter: medium skin tone                                  # E12.1  [1] 
(🧑🏽‍🚒)
+1F9D1 1F3FD 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; person 
with white cane: medium skin tone                       # E12.1  [1] (🧑🏽‍🦯)
+1F9D1 1F3FD 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in motorized wheelchair: medium skin tone               # E12.1  [1] (🧑🏽‍🦼)
+1F9D1 1F3FD 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in manual wheelchair: medium skin tone                  # E12.1  [1] (🧑🏽‍🦽)
+1F9D1 1F3FE 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; health 
worker: medium-dark skin tone                           # E12.1  [1] (🧑🏾‍⚕️)
+1F9D1 1F3FE 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; judge: 
medium-dark skin tone                                   # E12.1  [1] (🧑🏾‍⚖️)
+1F9D1 1F3FE 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; pilot: 
medium-dark skin tone                                   # E12.1  [1] (🧑🏾‍✈️)
+1F9D1 1F3FE 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; 
farmer: medium-dark skin tone                                  # E12.1  [1] 
(🧑🏾‍🌾)
+1F9D1 1F3FE 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; cook: 
medium-dark skin tone                                    # E12.1  [1] (🧑🏾‍🍳)
+1F9D1 1F3FE 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; person 
feeding baby: medium-dark skin tone                     # E13.0  [1] (🧑🏾‍🍼)
+1F9D1 1F3FE 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; 
student: medium-dark skin tone                                 # E12.1  [1] 
(🧑🏾‍🎓)
+1F9D1 1F3FE 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; 
singer: medium-dark skin tone                                  # E12.1  [1] 
(🧑🏾‍🎤)
+1F9D1 1F3FE 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; 
artist: medium-dark skin tone                                  # E12.1  [1] 
(🧑🏾‍🎨)
+1F9D1 1F3FE 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; 
teacher: medium-dark skin tone                                 # E12.1  [1] 
(🧑🏾‍🏫)
+1F9D1 1F3FE 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; 
factory worker: medium-dark skin tone                          # E12.1  [1] 
(🧑🏾‍🏭)
+1F9D1 1F3FE 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; 
technologist: medium-dark skin tone                            # E12.1  [1] 
(🧑🏾‍💻)
+1F9D1 1F3FE 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; office 
worker: medium-dark skin tone                           # E12.1  [1] (🧑🏾‍💼)
+1F9D1 1F3FE 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; 
mechanic: medium-dark skin tone                                # E12.1  [1] 
(🧑🏾‍🔧)
+1F9D1 1F3FE 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; 
scientist: medium-dark skin tone                               # E12.1  [1] 
(🧑🏾‍🔬)
+1F9D1 1F3FE 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; 
astronaut: medium-dark skin tone                               # E12.1  [1] 
(🧑🏾‍🚀)
+1F9D1 1F3FE 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; 
firefighter: medium-dark skin tone                             # E12.1  [1] 
(🧑🏾‍🚒)
+1F9D1 1F3FE 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; person 
with white cane: medium-dark skin tone                  # E12.1  [1] (🧑🏾‍🦯)
+1F9D1 1F3FE 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in motorized wheelchair: medium-dark skin tone          # E12.1  [1] (🧑🏾‍🦼)
+1F9D1 1F3FE 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in manual wheelchair: medium-dark skin tone             # E12.1  [1] (🧑🏾‍🦽)
+1F9D1 1F3FF 200D 2695 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; health 
worker: dark skin tone                                  # E12.1  [1] (🧑🏿‍⚕️)
+1F9D1 1F3FF 200D 2696 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; judge: 
dark skin tone                                          # E12.1  [1] (🧑🏿‍⚖️)
+1F9D1 1F3FF 200D 2708 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; pilot: 
dark skin tone                                          # E12.1  [1] (🧑🏿‍✈️)
+1F9D1 1F3FF 200D 1F33E                      ; RGI_Emoji_ZWJ_Sequence  ; 
farmer: dark skin tone                                         # E12.1  [1] 
(🧑🏿‍🌾)
+1F9D1 1F3FF 200D 1F373                      ; RGI_Emoji_ZWJ_Sequence  ; cook: 
dark skin tone                                           # E12.1  [1] (🧑🏿‍🍳)
+1F9D1 1F3FF 200D 1F37C                      ; RGI_Emoji_ZWJ_Sequence  ; person 
feeding baby: dark skin tone                            # E13.0  [1] (🧑🏿‍🍼)
+1F9D1 1F3FF 200D 1F393                      ; RGI_Emoji_ZWJ_Sequence  ; 
student: dark skin tone                                        # E12.1  [1] 
(🧑🏿‍🎓)
+1F9D1 1F3FF 200D 1F3A4                      ; RGI_Emoji_ZWJ_Sequence  ; 
singer: dark skin tone                                         # E12.1  [1] 
(🧑🏿‍🎤)
+1F9D1 1F3FF 200D 1F3A8                      ; RGI_Emoji_ZWJ_Sequence  ; 
artist: dark skin tone                                         # E12.1  [1] 
(🧑🏿‍🎨)
+1F9D1 1F3FF 200D 1F3EB                      ; RGI_Emoji_ZWJ_Sequence  ; 
teacher: dark skin tone                                        # E12.1  [1] 
(🧑🏿‍🏫)
+1F9D1 1F3FF 200D 1F3ED                      ; RGI_Emoji_ZWJ_Sequence  ; 
factory worker: dark skin tone                                 # E12.1  [1] 
(🧑🏿‍🏭)
+1F9D1 1F3FF 200D 1F4BB                      ; RGI_Emoji_ZWJ_Sequence  ; 
technologist: dark skin tone                                   # E12.1  [1] 
(🧑🏿‍💻)
+1F9D1 1F3FF 200D 1F4BC                      ; RGI_Emoji_ZWJ_Sequence  ; office 
worker: dark skin tone                                  # E12.1  [1] (🧑🏿‍💼)
+1F9D1 1F3FF 200D 1F527                      ; RGI_Emoji_ZWJ_Sequence  ; 
mechanic: dark skin tone                                       # E12.1  [1] 
(🧑🏿‍🔧)
+1F9D1 1F3FF 200D 1F52C                      ; RGI_Emoji_ZWJ_Sequence  ; 
scientist: dark skin tone                                      # E12.1  [1] 
(🧑🏿‍🔬)
+1F9D1 1F3FF 200D 1F680                      ; RGI_Emoji_ZWJ_Sequence  ; 
astronaut: dark skin tone                                      # E12.1  [1] 
(🧑🏿‍🚀)
+1F9D1 1F3FF 200D 1F692                      ; RGI_Emoji_ZWJ_Sequence  ; 
firefighter: dark skin tone                                    # E12.1  [1] 
(🧑🏿‍🚒)
+1F9D1 1F3FF 200D 1F9AF                      ; RGI_Emoji_ZWJ_Sequence  ; person 
with white cane: dark skin tone                         # E12.1  [1] (🧑🏿‍🦯)
+1F9D1 1F3FF 200D 1F9BC                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in motorized wheelchair: dark skin tone                 # E12.1  [1] (🧑🏿‍🦼)
+1F9D1 1F3FF 200D 1F9BD                      ; RGI_Emoji_ZWJ_Sequence  ; person 
in manual wheelchair: dark skin tone                    # E12.1  [1] (🧑🏿‍🦽)
+
+# Total elements: 360
+
+# ================================================
+
+# RGI_Emoji_ZWJ_Sequence: Gendered
+
+26F9 1F3FB 200D 2640 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; woman 
bouncing ball: light skin tone                           # E4.0   [1] (⛹🏻‍♀️)
+26F9 1F3FB 200D 2642 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; man 
bouncing ball: light skin tone                             # E4.0   [1] (⛹🏻‍♂️)
+26F9 1F3FC 200D 2640 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; woman 
bouncing ball: medium-light skin tone                    # E4.0   [1] (⛹🏼‍♀️)
+26F9 1F3FC 200D 2642 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; man 
bouncing ball: medium-light skin tone                      # E4.0   [1] (⛹🏼‍♂️)
+26F9 1F3FD 200D 2640 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; woman 
bouncing ball: medium skin tone                          # E4.0   [1] (⛹🏽‍♀️)
+26F9 1F3FD 200D 2642 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; man 
bouncing ball: medium skin tone                            # E4.0   [1] (⛹🏽‍♂️)
+26F9 1F3FE 200D 2640 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; woman 
bouncing ball: medium-dark skin tone                     # E4.0   [1] (⛹🏾‍♀️)
+26F9 1F3FE 200D 2642 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; man 
bouncing ball: medium-dark skin tone                       # E4.0   [1] (⛹🏾‍♂️)
+26F9 1F3FF 200D 2640 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; woman 
bouncing ball: dark skin tone                            # E4.0   [1] (⛹🏿‍♀️)
+26F9 1F3FF 200D 2642 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; man 
bouncing ball: dark skin tone                              # E4.0   [1] (⛹🏿‍♂️)
+26F9 FE0F 200D 2640 FE0F                    ; RGI_Emoji_ZWJ_Sequence  ; woman 
bouncing ball                                            # E4.0   [1] (⛹️‍♀️)
+26F9 FE0F 200D 2642 FE0F                    ; RGI_Emoji_ZWJ_Sequence  ; man 
bouncing ball                                              # E4.0   [1] (⛹️‍♂️)
+1F3C3 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
running                                                  # E4.0   [1] (🏃‍♀️)
+1F3C3 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
running                                                    # E4.0   [1] (🏃‍♂️)
+1F3C3 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
running: light skin tone                                 # E4.0   [1] (🏃🏻‍♀️)
+1F3C3 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
running: light skin tone                                   # E4.0   [1] (🏃🏻‍♂️)
+1F3C3 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
running: medium-light skin tone                          # E4.0   [1] (🏃🏼‍♀️)
+1F3C3 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
running: medium-light skin tone                            # E4.0   [1] (🏃🏼‍♂️)
+1F3C3 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
running: medium skin tone                                # E4.0   [1] (🏃🏽‍♀️)
+1F3C3 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
running: medium skin tone                                  # E4.0   [1] (🏃🏽‍♂️)
+1F3C3 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
running: medium-dark skin tone                           # E4.0   [1] (🏃🏾‍♀️)
+1F3C3 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
running: medium-dark skin tone                             # E4.0   [1] (🏃🏾‍♂️)
+1F3C3 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
running: dark skin tone                                  # E4.0   [1] (🏃🏿‍♀️)
+1F3C3 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
running: dark skin tone                                    # E4.0   [1] (🏃🏿‍♂️)
+1F3C4 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
surfing                                                  # E4.0   [1] (🏄‍♀️)
+1F3C4 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
surfing                                                    # E4.0   [1] (🏄‍♂️)
+1F3C4 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
surfing: light skin tone                                 # E4.0   [1] (🏄🏻‍♀️)
+1F3C4 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
surfing: light skin tone                                   # E4.0   [1] (🏄🏻‍♂️)
+1F3C4 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
surfing: medium-light skin tone                          # E4.0   [1] (🏄🏼‍♀️)
+1F3C4 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
surfing: medium-light skin tone                            # E4.0   [1] (🏄🏼‍♂️)
+1F3C4 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
surfing: medium skin tone                                # E4.0   [1] (🏄🏽‍♀️)
+1F3C4 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
surfing: medium skin tone                                  # E4.0   [1] (🏄🏽‍♂️)
+1F3C4 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
surfing: medium-dark skin tone                           # E4.0   [1] (🏄🏾‍♀️)
+1F3C4 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
surfing: medium-dark skin tone                             # E4.0   [1] (🏄🏾‍♂️)
+1F3C4 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
surfing: dark skin tone                                  # E4.0   [1] (🏄🏿‍♀️)
+1F3C4 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
surfing: dark skin tone                                    # E4.0   [1] (🏄🏿‍♂️)
+1F3CA 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
swimming                                                 # E4.0   [1] (🏊‍♀️)
+1F3CA 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
swimming                                                   # E4.0   [1] (🏊‍♂️)
+1F3CA 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
swimming: light skin tone                                # E4.0   [1] (🏊🏻‍♀️)
+1F3CA 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
swimming: light skin tone                                  # E4.0   [1] (🏊🏻‍♂️)
+1F3CA 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
swimming: medium-light skin tone                         # E4.0   [1] (🏊🏼‍♀️)
+1F3CA 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
swimming: medium-light skin tone                           # E4.0   [1] (🏊🏼‍♂️)
+1F3CA 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
swimming: medium skin tone                               # E4.0   [1] (🏊🏽‍♀️)
+1F3CA 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
swimming: medium skin tone                                 # E4.0   [1] (🏊🏽‍♂️)
+1F3CA 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
swimming: medium-dark skin tone                          # E4.0   [1] (🏊🏾‍♀️)
+1F3CA 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
swimming: medium-dark skin tone                            # E4.0   [1] (🏊🏾‍♂️)
+1F3CA 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
swimming: dark skin tone                                 # E4.0   [1] (🏊🏿‍♀️)
+1F3CA 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
swimming: dark skin tone                                   # E4.0   [1] (🏊🏿‍♂️)
+1F3CB 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
lifting weights: light skin tone                         # E4.0   [1] (🏋🏻‍♀️)
+1F3CB 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
lifting weights: light skin tone                           # E4.0   [1] (🏋🏻‍♂️)
+1F3CB 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
lifting weights: medium-light skin tone                  # E4.0   [1] (🏋🏼‍♀️)
+1F3CB 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
lifting weights: medium-light skin tone                    # E4.0   [1] (🏋🏼‍♂️)
+1F3CB 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
lifting weights: medium skin tone                        # E4.0   [1] (🏋🏽‍♀️)
+1F3CB 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
lifting weights: medium skin tone                          # E4.0   [1] (🏋🏽‍♂️)
+1F3CB 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
lifting weights: medium-dark skin tone                   # E4.0   [1] (🏋🏾‍♀️)
+1F3CB 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
lifting weights: medium-dark skin tone                     # E4.0   [1] (🏋🏾‍♂️)
+1F3CB 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
lifting weights: dark skin tone                          # E4.0   [1] (🏋🏿‍♀️)
+1F3CB 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
lifting weights: dark skin tone                            # E4.0   [1] (🏋🏿‍♂️)
+1F3CB FE0F 200D 2640 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; woman 
lifting weights                                          # E4.0   [1] (🏋️‍♀️)
+1F3CB FE0F 200D 2642 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; man 
lifting weights                                            # E4.0   [1] (🏋️‍♂️)
+1F3CC 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
golfing: light skin tone                                 # E4.0   [1] (🏌🏻‍♀️)
+1F3CC 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
golfing: light skin tone                                   # E4.0   [1] (🏌🏻‍♂️)
+1F3CC 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
golfing: medium-light skin tone                          # E4.0   [1] (🏌🏼‍♀️)
+1F3CC 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
golfing: medium-light skin tone                            # E4.0   [1] (🏌🏼‍♂️)
+1F3CC 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
golfing: medium skin tone                                # E4.0   [1] (🏌🏽‍♀️)
+1F3CC 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
golfing: medium skin tone                                  # E4.0   [1] (🏌🏽‍♂️)
+1F3CC 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
golfing: medium-dark skin tone                           # E4.0   [1] (🏌🏾‍♀️)
+1F3CC 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
golfing: medium-dark skin tone                             # E4.0   [1] (🏌🏾‍♂️)
+1F3CC 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
golfing: dark skin tone                                  # E4.0   [1] (🏌🏿‍♀️)
+1F3CC 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
golfing: dark skin tone                                    # E4.0   [1] (🏌🏿‍♂️)
+1F3CC FE0F 200D 2640 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; woman 
golfing                                                  # E4.0   [1] (🏌️‍♀️)
+1F3CC FE0F 200D 2642 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; man 
golfing                                                    # E4.0   [1] (🏌️‍♂️)
+1F46E 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
police officer                                           # E4.0   [1] (👮‍♀️)
+1F46E 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
police officer                                             # E4.0   [1] (👮‍♂️)
+1F46E 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
police officer: light skin tone                          # E4.0   [1] (👮🏻‍♀️)
+1F46E 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
police officer: light skin tone                            # E4.0   [1] (👮🏻‍♂️)
+1F46E 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
police officer: medium-light skin tone                   # E4.0   [1] (👮🏼‍♀️)
+1F46E 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
police officer: medium-light skin tone                     # E4.0   [1] (👮🏼‍♂️)
+1F46E 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
police officer: medium skin tone                         # E4.0   [1] (👮🏽‍♀️)
+1F46E 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
police officer: medium skin tone                           # E4.0   [1] (👮🏽‍♂️)
+1F46E 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
police officer: medium-dark skin tone                    # E4.0   [1] (👮🏾‍♀️)
+1F46E 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
police officer: medium-dark skin tone                      # E4.0   [1] (👮🏾‍♂️)
+1F46E 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
police officer: dark skin tone                           # E4.0   [1] (👮🏿‍♀️)
+1F46E 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
police officer: dark skin tone                             # E4.0   [1] (👮🏿‍♂️)
+1F46F 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; women 
with bunny ears                                          # E4.0   [1] (👯‍♀️)
+1F46F 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; men 
with bunny ears                                            # E4.0   [1] (👯‍♂️)
+1F470 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
with veil                                                # E13.0  [1] (👰‍♀️)
+1F470 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
with veil                                                  # E13.0  [1] (👰‍♂️)
+1F470 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
with veil: light skin tone                               # E13.0  [1] (👰🏻‍♀️)
+1F470 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
with veil: light skin tone                                 # E13.0  [1] (👰🏻‍♂️)
+1F470 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
with veil: medium-light skin tone                        # E13.0  [1] (👰🏼‍♀️)
+1F470 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
with veil: medium-light skin tone                          # E13.0  [1] (👰🏼‍♂️)
+1F470 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
with veil: medium skin tone                              # E13.0  [1] (👰🏽‍♀️)
+1F470 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
with veil: medium skin tone                                # E13.0  [1] (👰🏽‍♂️)
+1F470 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
with veil: medium-dark skin tone                         # E13.0  [1] (👰🏾‍♀️)
+1F470 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
with veil: medium-dark skin tone                           # E13.0  [1] (👰🏾‍♂️)
+1F470 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
with veil: dark skin tone                                # E13.0  [1] (👰🏿‍♀️)
+1F470 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
with veil: dark skin tone                                  # E13.0  [1] (👰🏿‍♂️)
+1F471 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman: 
blond hair                                              # E4.0   [1] (👱‍♀️)
+1F471 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man: 
blond hair                                                # E4.0   [1] (👱‍♂️)
+1F471 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
light skin tone, blond hair                             # E4.0   [1] (👱🏻‍♀️)
+1F471 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
light skin tone, blond hair                               # E4.0   [1] (👱🏻‍♂️)
+1F471 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-light skin tone, blond hair                      # E4.0   [1] (👱🏼‍♀️)
+1F471 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-light skin tone, blond hair                        # E4.0   [1] (👱🏼‍♂️)
+1F471 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium skin tone, blond hair                            # E4.0   [1] (👱🏽‍♀️)
+1F471 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium skin tone, blond hair                              # E4.0   [1] (👱🏽‍♂️)
+1F471 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-dark skin tone, blond hair                       # E4.0   [1] (👱🏾‍♀️)
+1F471 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-dark skin tone, blond hair                         # E4.0   [1] (👱🏾‍♂️)
+1F471 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
dark skin tone, blond hair                              # E4.0   [1] (👱🏿‍♀️)
+1F471 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
dark skin tone, blond hair                                # E4.0   [1] (👱🏿‍♂️)
+1F473 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
wearing turban                                           # E4.0   [1] (👳‍♀️)
+1F473 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
wearing turban                                             # E4.0   [1] (👳‍♂️)
+1F473 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
wearing turban: light skin tone                          # E4.0   [1] (👳🏻‍♀️)
+1F473 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
wearing turban: light skin tone                            # E4.0   [1] (👳🏻‍♂️)
+1F473 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
wearing turban: medium-light skin tone                   # E4.0   [1] (👳🏼‍♀️)
+1F473 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
wearing turban: medium-light skin tone                     # E4.0   [1] (👳🏼‍♂️)
+1F473 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
wearing turban: medium skin tone                         # E4.0   [1] (👳🏽‍♀️)
+1F473 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
wearing turban: medium skin tone                           # E4.0   [1] (👳🏽‍♂️)
+1F473 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
wearing turban: medium-dark skin tone                    # E4.0   [1] (👳🏾‍♀️)
+1F473 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
wearing turban: medium-dark skin tone                      # E4.0   [1] (👳🏾‍♂️)
+1F473 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
wearing turban: dark skin tone                           # E4.0   [1] (👳🏿‍♀️)
+1F473 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
wearing turban: dark skin tone                             # E4.0   [1] (👳🏿‍♂️)
+1F477 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
construction worker                                      # E4.0   [1] (👷‍♀️)
+1F477 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
construction worker                                        # E4.0   [1] (👷‍♂️)
+1F477 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
construction worker: light skin tone                     # E4.0   [1] (👷🏻‍♀️)
+1F477 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
construction worker: light skin tone                       # E4.0   [1] (👷🏻‍♂️)
+1F477 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
construction worker: medium-light skin tone              # E4.0   [1] (👷🏼‍♀️)
+1F477 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
construction worker: medium-light skin tone                # E4.0   [1] (👷🏼‍♂️)
+1F477 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
construction worker: medium skin tone                    # E4.0   [1] (👷🏽‍♀️)
+1F477 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
construction worker: medium skin tone                      # E4.0   [1] (👷🏽‍♂️)
+1F477 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
construction worker: medium-dark skin tone               # E4.0   [1] (👷🏾‍♀️)
+1F477 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
construction worker: medium-dark skin tone                 # E4.0   [1] (👷🏾‍♂️)
+1F477 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
construction worker: dark skin tone                      # E4.0   [1] (👷🏿‍♀️)
+1F477 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
construction worker: dark skin tone                        # E4.0   [1] (👷🏿‍♂️)
+1F481 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
tipping hand                                             # E4.0   [1] (💁‍♀️)
+1F481 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
tipping hand                                               # E4.0   [1] (💁‍♂️)
+1F481 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
tipping hand: light skin tone                            # E4.0   [1] (💁🏻‍♀️)
+1F481 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
tipping hand: light skin tone                              # E4.0   [1] (💁🏻‍♂️)
+1F481 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
tipping hand: medium-light skin tone                     # E4.0   [1] (💁🏼‍♀️)
+1F481 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
tipping hand: medium-light skin tone                       # E4.0   [1] (💁🏼‍♂️)
+1F481 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
tipping hand: medium skin tone                           # E4.0   [1] (💁🏽‍♀️)
+1F481 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
tipping hand: medium skin tone                             # E4.0   [1] (💁🏽‍♂️)
+1F481 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
tipping hand: medium-dark skin tone                      # E4.0   [1] (💁🏾‍♀️)
+1F481 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
tipping hand: medium-dark skin tone                        # E4.0   [1] (💁🏾‍♂️)
+1F481 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
tipping hand: dark skin tone                             # E4.0   [1] (💁🏿‍♀️)
+1F481 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
tipping hand: dark skin tone                               # E4.0   [1] (💁🏿‍♂️)
+1F482 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
guard                                                    # E4.0   [1] (💂‍♀️)
+1F482 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
guard                                                      # E4.0   [1] (💂‍♂️)
+1F482 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
guard: light skin tone                                   # E4.0   [1] (💂🏻‍♀️)
+1F482 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
guard: light skin tone                                     # E4.0   [1] (💂🏻‍♂️)
+1F482 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
guard: medium-light skin tone                            # E4.0   [1] (💂🏼‍♀️)
+1F482 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
guard: medium-light skin tone                              # E4.0   [1] (💂🏼‍♂️)
+1F482 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
guard: medium skin tone                                  # E4.0   [1] (💂🏽‍♀️)
+1F482 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
guard: medium skin tone                                    # E4.0   [1] (💂🏽‍♂️)
+1F482 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
guard: medium-dark skin tone                             # E4.0   [1] (💂🏾‍♀️)
+1F482 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
guard: medium-dark skin tone                               # E4.0   [1] (💂🏾‍♂️)
+1F482 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
guard: dark skin tone                                    # E4.0   [1] (💂🏿‍♀️)
+1F482 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
guard: dark skin tone                                      # E4.0   [1] (💂🏿‍♂️)
+1F486 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting massage                                          # E4.0   [1] (💆‍♀️)
+1F486 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
getting massage                                            # E4.0   [1] (💆‍♂️)
+1F486 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting massage: light skin tone                         # E4.0   [1] (💆🏻‍♀️)
+1F486 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting massage: light skin tone                           # E4.0   [1] (💆🏻‍♂️)
+1F486 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting massage: medium-light skin tone                  # E4.0   [1] (💆🏼‍♀️)
+1F486 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting massage: medium-light skin tone                    # E4.0   [1] (💆🏼‍♂️)
+1F486 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting massage: medium skin tone                        # E4.0   [1] (💆🏽‍♀️)
+1F486 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting massage: medium skin tone                          # E4.0   [1] (💆🏽‍♂️)
+1F486 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting massage: medium-dark skin tone                   # E4.0   [1] (💆🏾‍♀️)
+1F486 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting massage: medium-dark skin tone                     # E4.0   [1] (💆🏾‍♂️)
+1F486 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting massage: dark skin tone                          # E4.0   [1] (💆🏿‍♀️)
+1F486 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting massage: dark skin tone                            # E4.0   [1] (💆🏿‍♂️)
+1F487 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting haircut                                          # E4.0   [1] (💇‍♀️)
+1F487 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
getting haircut                                            # E4.0   [1] (💇‍♂️)
+1F487 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting haircut: light skin tone                         # E4.0   [1] (💇🏻‍♀️)
+1F487 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting haircut: light skin tone                           # E4.0   [1] (💇🏻‍♂️)
+1F487 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting haircut: medium-light skin tone                  # E4.0   [1] (💇🏼‍♀️)
+1F487 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting haircut: medium-light skin tone                    # E4.0   [1] (💇🏼‍♂️)
+1F487 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting haircut: medium skin tone                        # E4.0   [1] (💇🏽‍♀️)
+1F487 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting haircut: medium skin tone                          # E4.0   [1] (💇🏽‍♂️)
+1F487 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting haircut: medium-dark skin tone                   # E4.0   [1] (💇🏾‍♀️)
+1F487 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting haircut: medium-dark skin tone                     # E4.0   [1] (💇🏾‍♂️)
+1F487 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
getting haircut: dark skin tone                          # E4.0   [1] (💇🏿‍♀️)
+1F487 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
getting haircut: dark skin tone                            # E4.0   [1] (💇🏿‍♂️)
+1F575 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
detective: light skin tone                               # E4.0   [1] (🕵🏻‍♀️)
+1F575 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
detective: light skin tone                                 # E4.0   [1] (🕵🏻‍♂️)
+1F575 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
detective: medium-light skin tone                        # E4.0   [1] (🕵🏼‍♀️)
+1F575 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
detective: medium-light skin tone                          # E4.0   [1] (🕵🏼‍♂️)
+1F575 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
detective: medium skin tone                              # E4.0   [1] (🕵🏽‍♀️)
+1F575 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
detective: medium skin tone                                # E4.0   [1] (🕵🏽‍♂️)
+1F575 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
detective: medium-dark skin tone                         # E4.0   [1] (🕵🏾‍♀️)
+1F575 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
detective: medium-dark skin tone                           # E4.0   [1] (🕵🏾‍♂️)
+1F575 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
detective: dark skin tone                                # E4.0   [1] (🕵🏿‍♀️)
+1F575 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
detective: dark skin tone                                  # E4.0   [1] (🕵🏿‍♂️)
+1F575 FE0F 200D 2640 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; woman 
detective                                                # E4.0   [1] (🕵️‍♀️)
+1F575 FE0F 200D 2642 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; man 
detective                                                  # E4.0   [1] (🕵️‍♂️)
+1F645 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing NO                                             # E4.0   [1] (🙅‍♀️)
+1F645 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing NO                                               # E4.0   [1] (🙅‍♂️)
+1F645 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing NO: light skin tone                            # E4.0   [1] (🙅🏻‍♀️)
+1F645 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing NO: light skin tone                              # E4.0   [1] (🙅🏻‍♂️)
+1F645 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing NO: medium-light skin tone                     # E4.0   [1] (🙅🏼‍♀️)
+1F645 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing NO: medium-light skin tone                       # E4.0   [1] (🙅🏼‍♂️)
+1F645 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing NO: medium skin tone                           # E4.0   [1] (🙅🏽‍♀️)
+1F645 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing NO: medium skin tone                             # E4.0   [1] (🙅🏽‍♂️)
+1F645 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing NO: medium-dark skin tone                      # E4.0   [1] (🙅🏾‍♀️)
+1F645 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing NO: medium-dark skin tone                        # E4.0   [1] (🙅🏾‍♂️)
+1F645 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing NO: dark skin tone                             # E4.0   [1] (🙅🏿‍♀️)
+1F645 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing NO: dark skin tone                               # E4.0   [1] (🙅🏿‍♂️)
+1F646 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing OK                                             # E4.0   [1] (🙆‍♀️)
+1F646 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing OK                                               # E4.0   [1] (🙆‍♂️)
+1F646 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing OK: light skin tone                            # E4.0   [1] (🙆🏻‍♀️)
+1F646 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing OK: light skin tone                              # E4.0   [1] (🙆🏻‍♂️)
+1F646 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing OK: medium-light skin tone                     # E4.0   [1] (🙆🏼‍♀️)
+1F646 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing OK: medium-light skin tone                       # E4.0   [1] (🙆🏼‍♂️)
+1F646 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing OK: medium skin tone                           # E4.0   [1] (🙆🏽‍♀️)
+1F646 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing OK: medium skin tone                             # E4.0   [1] (🙆🏽‍♂️)
+1F646 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing OK: medium-dark skin tone                      # E4.0   [1] (🙆🏾‍♀️)
+1F646 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing OK: medium-dark skin tone                        # E4.0   [1] (🙆🏾‍♂️)
+1F646 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
gesturing OK: dark skin tone                             # E4.0   [1] (🙆🏿‍♀️)
+1F646 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
gesturing OK: dark skin tone                               # E4.0   [1] (🙆🏿‍♂️)
+1F647 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
bowing                                                   # E4.0   [1] (🙇‍♀️)
+1F647 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
bowing                                                     # E4.0   [1] (🙇‍♂️)
+1F647 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
bowing: light skin tone                                  # E4.0   [1] (🙇🏻‍♀️)
+1F647 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
bowing: light skin tone                                    # E4.0   [1] (🙇🏻‍♂️)
+1F647 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
bowing: medium-light skin tone                           # E4.0   [1] (🙇🏼‍♀️)
+1F647 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
bowing: medium-light skin tone                             # E4.0   [1] (🙇🏼‍♂️)
+1F647 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
bowing: medium skin tone                                 # E4.0   [1] (🙇🏽‍♀️)
+1F647 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
bowing: medium skin tone                                   # E4.0   [1] (🙇🏽‍♂️)
+1F647 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
bowing: medium-dark skin tone                            # E4.0   [1] (🙇🏾‍♀️)
+1F647 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
bowing: medium-dark skin tone                              # E4.0   [1] (🙇🏾‍♂️)
+1F647 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
bowing: dark skin tone                                   # E4.0   [1] (🙇🏿‍♀️)
+1F647 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
bowing: dark skin tone                                     # E4.0   [1] (🙇🏿‍♂️)
+1F64B 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
raising hand                                             # E4.0   [1] (🙋‍♀️)
+1F64B 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
raising hand                                               # E4.0   [1] (🙋‍♂️)
+1F64B 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
raising hand: light skin tone                            # E4.0   [1] (🙋🏻‍♀️)
+1F64B 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
raising hand: light skin tone                              # E4.0   [1] (🙋🏻‍♂️)
+1F64B 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
raising hand: medium-light skin tone                     # E4.0   [1] (🙋🏼‍♀️)
+1F64B 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
raising hand: medium-light skin tone                       # E4.0   [1] (🙋🏼‍♂️)
+1F64B 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
raising hand: medium skin tone                           # E4.0   [1] (🙋🏽‍♀️)
+1F64B 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
raising hand: medium skin tone                             # E4.0   [1] (🙋🏽‍♂️)
+1F64B 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
raising hand: medium-dark skin tone                      # E4.0   [1] (🙋🏾‍♀️)
+1F64B 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
raising hand: medium-dark skin tone                        # E4.0   [1] (🙋🏾‍♂️)
+1F64B 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
raising hand: dark skin tone                             # E4.0   [1] (🙋🏿‍♀️)
+1F64B 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
raising hand: dark skin tone                               # E4.0   [1] (🙋🏿‍♂️)
+1F64D 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
frowning                                                 # E4.0   [1] (🙍‍♀️)
+1F64D 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
frowning                                                   # E4.0   [1] (🙍‍♂️)
+1F64D 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
frowning: light skin tone                                # E4.0   [1] (🙍🏻‍♀️)
+1F64D 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
frowning: light skin tone                                  # E4.0   [1] (🙍🏻‍♂️)
+1F64D 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
frowning: medium-light skin tone                         # E4.0   [1] (🙍🏼‍♀️)
+1F64D 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
frowning: medium-light skin tone                           # E4.0   [1] (🙍🏼‍♂️)
+1F64D 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
frowning: medium skin tone                               # E4.0   [1] (🙍🏽‍♀️)
+1F64D 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
frowning: medium skin tone                                 # E4.0   [1] (🙍🏽‍♂️)
+1F64D 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
frowning: medium-dark skin tone                          # E4.0   [1] (🙍🏾‍♀️)
+1F64D 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
frowning: medium-dark skin tone                            # E4.0   [1] (🙍🏾‍♂️)
+1F64D 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
frowning: dark skin tone                                 # E4.0   [1] (🙍🏿‍♀️)
+1F64D 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
frowning: dark skin tone                                   # E4.0   [1] (🙍🏿‍♂️)
+1F64E 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
pouting                                                  # E4.0   [1] (🙎‍♀️)
+1F64E 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
pouting                                                    # E4.0   [1] (🙎‍♂️)
+1F64E 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pouting: light skin tone                                 # E4.0   [1] (🙎🏻‍♀️)
+1F64E 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pouting: light skin tone                                   # E4.0   [1] (🙎🏻‍♂️)
+1F64E 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pouting: medium-light skin tone                          # E4.0   [1] (🙎🏼‍♀️)
+1F64E 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pouting: medium-light skin tone                            # E4.0   [1] (🙎🏼‍♂️)
+1F64E 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pouting: medium skin tone                                # E4.0   [1] (🙎🏽‍♀️)
+1F64E 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pouting: medium skin tone                                  # E4.0   [1] (🙎🏽‍♂️)
+1F64E 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pouting: medium-dark skin tone                           # E4.0   [1] (🙎🏾‍♀️)
+1F64E 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pouting: medium-dark skin tone                             # E4.0   [1] (🙎🏾‍♂️)
+1F64E 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
pouting: dark skin tone                                  # E4.0   [1] (🙎🏿‍♀️)
+1F64E 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
pouting: dark skin tone                                    # E4.0   [1] (🙎🏿‍♂️)
+1F6A3 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
rowing boat                                              # E4.0   [1] (🚣‍♀️)
+1F6A3 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
rowing boat                                                # E4.0   [1] (🚣‍♂️)
+1F6A3 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
rowing boat: light skin tone                             # E4.0   [1] (🚣🏻‍♀️)
+1F6A3 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
rowing boat: light skin tone                               # E4.0   [1] (🚣🏻‍♂️)
+1F6A3 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
rowing boat: medium-light skin tone                      # E4.0   [1] (🚣🏼‍♀️)
+1F6A3 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
rowing boat: medium-light skin tone                        # E4.0   [1] (🚣🏼‍♂️)
+1F6A3 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
rowing boat: medium skin tone                            # E4.0   [1] (🚣🏽‍♀️)
+1F6A3 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
rowing boat: medium skin tone                              # E4.0   [1] (🚣🏽‍♂️)
+1F6A3 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
rowing boat: medium-dark skin tone                       # E4.0   [1] (🚣🏾‍♀️)
+1F6A3 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
rowing boat: medium-dark skin tone                         # E4.0   [1] (🚣🏾‍♂️)
+1F6A3 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
rowing boat: dark skin tone                              # E4.0   [1] (🚣🏿‍♀️)
+1F6A3 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
rowing boat: dark skin tone                                # E4.0   [1] (🚣🏿‍♂️)
+1F6B4 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
biking                                                   # E4.0   [1] (🚴‍♀️)
+1F6B4 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
biking                                                     # E4.0   [1] (🚴‍♂️)
+1F6B4 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
biking: light skin tone                                  # E4.0   [1] (🚴🏻‍♀️)
+1F6B4 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
biking: light skin tone                                    # E4.0   [1] (🚴🏻‍♂️)
+1F6B4 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
biking: medium-light skin tone                           # E4.0   [1] (🚴🏼‍♀️)
+1F6B4 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
biking: medium-light skin tone                             # E4.0   [1] (🚴🏼‍♂️)
+1F6B4 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
biking: medium skin tone                                 # E4.0   [1] (🚴🏽‍♀️)
+1F6B4 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
biking: medium skin tone                                   # E4.0   [1] (🚴🏽‍♂️)
+1F6B4 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
biking: medium-dark skin tone                            # E4.0   [1] (🚴🏾‍♀️)
+1F6B4 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
biking: medium-dark skin tone                              # E4.0   [1] (🚴🏾‍♂️)
+1F6B4 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
biking: dark skin tone                                   # E4.0   [1] (🚴🏿‍♀️)
+1F6B4 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
biking: dark skin tone                                     # E4.0   [1] (🚴🏿‍♂️)
+1F6B5 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
mountain biking                                          # E4.0   [1] (🚵‍♀️)
+1F6B5 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
mountain biking                                            # E4.0   [1] (🚵‍♂️)
+1F6B5 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mountain biking: light skin tone                         # E4.0   [1] (🚵🏻‍♀️)
+1F6B5 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mountain biking: light skin tone                           # E4.0   [1] (🚵🏻‍♂️)
+1F6B5 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mountain biking: medium-light skin tone                  # E4.0   [1] (🚵🏼‍♀️)
+1F6B5 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mountain biking: medium-light skin tone                    # E4.0   [1] (🚵🏼‍♂️)
+1F6B5 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mountain biking: medium skin tone                        # E4.0   [1] (🚵🏽‍♀️)
+1F6B5 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mountain biking: medium skin tone                          # E4.0   [1] (🚵🏽‍♂️)
+1F6B5 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mountain biking: medium-dark skin tone                   # E4.0   [1] (🚵🏾‍♀️)
+1F6B5 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mountain biking: medium-dark skin tone                     # E4.0   [1] (🚵🏾‍♂️)
+1F6B5 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mountain biking: dark skin tone                          # E4.0   [1] (🚵🏿‍♀️)
+1F6B5 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mountain biking: dark skin tone                            # E4.0   [1] (🚵🏿‍♂️)
+1F6B6 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
walking                                                  # E4.0   [1] (🚶‍♀️)
+1F6B6 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
walking                                                    # E4.0   [1] (🚶‍♂️)
+1F6B6 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
walking: light skin tone                                 # E4.0   [1] (🚶🏻‍♀️)
+1F6B6 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
walking: light skin tone                                   # E4.0   [1] (🚶🏻‍♂️)
+1F6B6 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
walking: medium-light skin tone                          # E4.0   [1] (🚶🏼‍♀️)
+1F6B6 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
walking: medium-light skin tone                            # E4.0   [1] (🚶🏼‍♂️)
+1F6B6 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
walking: medium skin tone                                # E4.0   [1] (🚶🏽‍♀️)
+1F6B6 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
walking: medium skin tone                                  # E4.0   [1] (🚶🏽‍♂️)
+1F6B6 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
walking: medium-dark skin tone                           # E4.0   [1] (🚶🏾‍♀️)
+1F6B6 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
walking: medium-dark skin tone                             # E4.0   [1] (🚶🏾‍♂️)
+1F6B6 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
walking: dark skin tone                                  # E4.0   [1] (🚶🏿‍♀️)
+1F6B6 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
walking: dark skin tone                                    # E4.0   [1] (🚶🏿‍♂️)
+1F926 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
facepalming                                              # E4.0   [1] (🤦‍♀️)
+1F926 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
facepalming                                                # E4.0   [1] (🤦‍♂️)
+1F926 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
facepalming: light skin tone                             # E4.0   [1] (🤦🏻‍♀️)
+1F926 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
facepalming: light skin tone                               # E4.0   [1] (🤦🏻‍♂️)
+1F926 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
facepalming: medium-light skin tone                      # E4.0   [1] (🤦🏼‍♀️)
+1F926 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
facepalming: medium-light skin tone                        # E4.0   [1] (🤦🏼‍♂️)
+1F926 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
facepalming: medium skin tone                            # E4.0   [1] (🤦🏽‍♀️)
+1F926 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
facepalming: medium skin tone                              # E4.0   [1] (🤦🏽‍♂️)
+1F926 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
facepalming: medium-dark skin tone                       # E4.0   [1] (🤦🏾‍♀️)
+1F926 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
facepalming: medium-dark skin tone                         # E4.0   [1] (🤦🏾‍♂️)
+1F926 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
facepalming: dark skin tone                              # E4.0   [1] (🤦🏿‍♀️)
+1F926 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
facepalming: dark skin tone                                # E4.0   [1] (🤦🏿‍♂️)
+1F935 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
in tuxedo                                                # E13.0  [1] (🤵‍♀️)
+1F935 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man in 
tuxedo                                                  # E13.0  [1] (🤵‍♂️)
+1F935 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in tuxedo: light skin tone                               # E13.0  [1] (🤵🏻‍♀️)
+1F935 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
tuxedo: light skin tone                                 # E13.0  [1] (🤵🏻‍♂️)
+1F935 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in tuxedo: medium-light skin tone                        # E13.0  [1] (🤵🏼‍♀️)
+1F935 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
tuxedo: medium-light skin tone                          # E13.0  [1] (🤵🏼‍♂️)
+1F935 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in tuxedo: medium skin tone                              # E13.0  [1] (🤵🏽‍♀️)
+1F935 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
tuxedo: medium skin tone                                # E13.0  [1] (🤵🏽‍♂️)
+1F935 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in tuxedo: medium-dark skin tone                         # E13.0  [1] (🤵🏾‍♀️)
+1F935 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
tuxedo: medium-dark skin tone                           # E13.0  [1] (🤵🏾‍♂️)
+1F935 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in tuxedo: dark skin tone                                # E13.0  [1] (🤵🏿‍♀️)
+1F935 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
tuxedo: dark skin tone                                  # E13.0  [1] (🤵🏿‍♂️)
+1F937 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
shrugging                                                # E4.0   [1] (🤷‍♀️)
+1F937 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
shrugging                                                  # E4.0   [1] (🤷‍♂️)
+1F937 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
shrugging: light skin tone                               # E4.0   [1] (🤷🏻‍♀️)
+1F937 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
shrugging: light skin tone                                 # E4.0   [1] (🤷🏻‍♂️)
+1F937 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
shrugging: medium-light skin tone                        # E4.0   [1] (🤷🏼‍♀️)
+1F937 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
shrugging: medium-light skin tone                          # E4.0   [1] (🤷🏼‍♂️)
+1F937 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
shrugging: medium skin tone                              # E4.0   [1] (🤷🏽‍♀️)
+1F937 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
shrugging: medium skin tone                                # E4.0   [1] (🤷🏽‍♂️)
+1F937 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
shrugging: medium-dark skin tone                         # E4.0   [1] (🤷🏾‍♀️)
+1F937 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
shrugging: medium-dark skin tone                           # E4.0   [1] (🤷🏾‍♂️)
+1F937 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
shrugging: dark skin tone                                # E4.0   [1] (🤷🏿‍♀️)
+1F937 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
shrugging: dark skin tone                                  # E4.0   [1] (🤷🏿‍♂️)
+1F938 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
cartwheeling                                             # E4.0   [1] (🤸‍♀️)
+1F938 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
cartwheeling                                               # E4.0   [1] (🤸‍♂️)
+1F938 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
cartwheeling: light skin tone                            # E4.0   [1] (🤸🏻‍♀️)
+1F938 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
cartwheeling: light skin tone                              # E4.0   [1] (🤸🏻‍♂️)
+1F938 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
cartwheeling: medium-light skin tone                     # E4.0   [1] (🤸🏼‍♀️)
+1F938 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
cartwheeling: medium-light skin tone                       # E4.0   [1] (🤸🏼‍♂️)
+1F938 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
cartwheeling: medium skin tone                           # E4.0   [1] (🤸🏽‍♀️)
+1F938 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
cartwheeling: medium skin tone                             # E4.0   [1] (🤸🏽‍♂️)
+1F938 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
cartwheeling: medium-dark skin tone                      # E4.0   [1] (🤸🏾‍♀️)
+1F938 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
cartwheeling: medium-dark skin tone                        # E4.0   [1] (🤸🏾‍♂️)
+1F938 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
cartwheeling: dark skin tone                             # E4.0   [1] (🤸🏿‍♀️)
+1F938 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
cartwheeling: dark skin tone                               # E4.0   [1] (🤸🏿‍♂️)
+1F939 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
juggling                                                 # E4.0   [1] (🤹‍♀️)
+1F939 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
juggling                                                   # E4.0   [1] (🤹‍♂️)
+1F939 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
juggling: light skin tone                                # E4.0   [1] (🤹🏻‍♀️)
+1F939 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
juggling: light skin tone                                  # E4.0   [1] (🤹🏻‍♂️)
+1F939 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
juggling: medium-light skin tone                         # E4.0   [1] (🤹🏼‍♀️)
+1F939 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
juggling: medium-light skin tone                           # E4.0   [1] (🤹🏼‍♂️)
+1F939 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
juggling: medium skin tone                               # E4.0   [1] (🤹🏽‍♀️)
+1F939 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
juggling: medium skin tone                                 # E4.0   [1] (🤹🏽‍♂️)
+1F939 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
juggling: medium-dark skin tone                          # E4.0   [1] (🤹🏾‍♀️)
+1F939 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
juggling: medium-dark skin tone                            # E4.0   [1] (🤹🏾‍♂️)
+1F939 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
juggling: dark skin tone                                 # E4.0   [1] (🤹🏿‍♀️)
+1F939 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
juggling: dark skin tone                                   # E4.0   [1] (🤹🏿‍♂️)
+1F93C 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; women 
wrestling                                                # E4.0   [1] (🤼‍♀️)
+1F93C 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; men 
wrestling                                                  # E4.0   [1] (🤼‍♂️)
+1F93D 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing water polo                                       # E4.0   [1] (🤽‍♀️)
+1F93D 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
playing water polo                                         # E4.0   [1] (🤽‍♂️)
+1F93D 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing water polo: light skin tone                      # E4.0   [1] (🤽🏻‍♀️)
+1F93D 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing water polo: light skin tone                        # E4.0   [1] (🤽🏻‍♂️)
+1F93D 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing water polo: medium-light skin tone               # E4.0   [1] (🤽🏼‍♀️)
+1F93D 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing water polo: medium-light skin tone                 # E4.0   [1] (🤽🏼‍♂️)
+1F93D 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing water polo: medium skin tone                     # E4.0   [1] (🤽🏽‍♀️)
+1F93D 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing water polo: medium skin tone                       # E4.0   [1] (🤽🏽‍♂️)
+1F93D 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing water polo: medium-dark skin tone                # E4.0   [1] (🤽🏾‍♀️)
+1F93D 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing water polo: medium-dark skin tone                  # E4.0   [1] (🤽🏾‍♂️)
+1F93D 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing water polo: dark skin tone                       # E4.0   [1] (🤽🏿‍♀️)
+1F93D 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing water polo: dark skin tone                         # E4.0   [1] (🤽🏿‍♂️)
+1F93E 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing handball                                         # E4.0   [1] (🤾‍♀️)
+1F93E 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
playing handball                                           # E4.0   [1] (🤾‍♂️)
+1F93E 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing handball: light skin tone                        # E4.0   [1] (🤾🏻‍♀️)
+1F93E 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing handball: light skin tone                          # E4.0   [1] (🤾🏻‍♂️)
+1F93E 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing handball: medium-light skin tone                 # E4.0   [1] (🤾🏼‍♀️)
+1F93E 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing handball: medium-light skin tone                   # E4.0   [1] (🤾🏼‍♂️)
+1F93E 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing handball: medium skin tone                       # E4.0   [1] (🤾🏽‍♀️)
+1F93E 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing handball: medium skin tone                         # E4.0   [1] (🤾🏽‍♂️)
+1F93E 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing handball: medium-dark skin tone                  # E4.0   [1] (🤾🏾‍♀️)
+1F93E 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing handball: medium-dark skin tone                    # E4.0   [1] (🤾🏾‍♂️)
+1F93E 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
playing handball: dark skin tone                         # E4.0   [1] (🤾🏿‍♀️)
+1F93E 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
playing handball: dark skin tone                           # E4.0   [1] (🤾🏿‍♂️)
+1F9B8 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
superhero                                                # E11.0  [1] (🦸‍♀️)
+1F9B8 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
superhero                                                  # E11.0  [1] (🦸‍♂️)
+1F9B8 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
superhero: light skin tone                               # E11.0  [1] (🦸🏻‍♀️)
+1F9B8 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
superhero: light skin tone                                 # E11.0  [1] (🦸🏻‍♂️)
+1F9B8 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
superhero: medium-light skin tone                        # E11.0  [1] (🦸🏼‍♀️)
+1F9B8 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
superhero: medium-light skin tone                          # E11.0  [1] (🦸🏼‍♂️)
+1F9B8 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
superhero: medium skin tone                              # E11.0  [1] (🦸🏽‍♀️)
+1F9B8 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
superhero: medium skin tone                                # E11.0  [1] (🦸🏽‍♂️)
+1F9B8 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
superhero: medium-dark skin tone                         # E11.0  [1] (🦸🏾‍♀️)
+1F9B8 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
superhero: medium-dark skin tone                           # E11.0  [1] (🦸🏾‍♂️)
+1F9B8 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
superhero: dark skin tone                                # E11.0  [1] (🦸🏿‍♀️)
+1F9B8 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
superhero: dark skin tone                                  # E11.0  [1] (🦸🏿‍♂️)
+1F9B9 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
supervillain                                             # E11.0  [1] (🦹‍♀️)
+1F9B9 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
supervillain                                               # E11.0  [1] (🦹‍♂️)
+1F9B9 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
supervillain: light skin tone                            # E11.0  [1] (🦹🏻‍♀️)
+1F9B9 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
supervillain: light skin tone                              # E11.0  [1] (🦹🏻‍♂️)
+1F9B9 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
supervillain: medium-light skin tone                     # E11.0  [1] (🦹🏼‍♀️)
+1F9B9 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
supervillain: medium-light skin tone                       # E11.0  [1] (🦹🏼‍♂️)
+1F9B9 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
supervillain: medium skin tone                           # E11.0  [1] (🦹🏽‍♀️)
+1F9B9 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
supervillain: medium skin tone                             # E11.0  [1] (🦹🏽‍♂️)
+1F9B9 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
supervillain: medium-dark skin tone                      # E11.0  [1] (🦹🏾‍♀️)
+1F9B9 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
supervillain: medium-dark skin tone                        # E11.0  [1] (🦹🏾‍♂️)
+1F9B9 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
supervillain: dark skin tone                             # E11.0  [1] (🦹🏿‍♀️)
+1F9B9 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
supervillain: dark skin tone                               # E11.0  [1] (🦹🏿‍♂️)
+1F9CD 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
standing                                                 # E12.0  [1] (🧍‍♀️)
+1F9CD 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
standing                                                   # E12.0  [1] (🧍‍♂️)
+1F9CD 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
standing: light skin tone                                # E12.0  [1] (🧍🏻‍♀️)
+1F9CD 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
standing: light skin tone                                  # E12.0  [1] (🧍🏻‍♂️)
+1F9CD 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
standing: medium-light skin tone                         # E12.0  [1] (🧍🏼‍♀️)
+1F9CD 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
standing: medium-light skin tone                           # E12.0  [1] (🧍🏼‍♂️)
+1F9CD 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
standing: medium skin tone                               # E12.0  [1] (🧍🏽‍♀️)
+1F9CD 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
standing: medium skin tone                                 # E12.0  [1] (🧍🏽‍♂️)
+1F9CD 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
standing: medium-dark skin tone                          # E12.0  [1] (🧍🏾‍♀️)
+1F9CD 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
standing: medium-dark skin tone                            # E12.0  [1] (🧍🏾‍♂️)
+1F9CD 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
standing: dark skin tone                                 # E12.0  [1] (🧍🏿‍♀️)
+1F9CD 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
standing: dark skin tone                                   # E12.0  [1] (🧍🏿‍♂️)
+1F9CE 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
kneeling                                                 # E12.0  [1] (🧎‍♀️)
+1F9CE 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
kneeling                                                   # E12.0  [1] (🧎‍♂️)
+1F9CE 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
kneeling: light skin tone                                # E12.0  [1] (🧎🏻‍♀️)
+1F9CE 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
kneeling: light skin tone                                  # E12.0  [1] (🧎🏻‍♂️)
+1F9CE 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
kneeling: medium-light skin tone                         # E12.0  [1] (🧎🏼‍♀️)
+1F9CE 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
kneeling: medium-light skin tone                           # E12.0  [1] (🧎🏼‍♂️)
+1F9CE 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
kneeling: medium skin tone                               # E12.0  [1] (🧎🏽‍♀️)
+1F9CE 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
kneeling: medium skin tone                                 # E12.0  [1] (🧎🏽‍♂️)
+1F9CE 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
kneeling: medium-dark skin tone                          # E12.0  [1] (🧎🏾‍♀️)
+1F9CE 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
kneeling: medium-dark skin tone                            # E12.0  [1] (🧎🏾‍♂️)
+1F9CE 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
kneeling: dark skin tone                                 # E12.0  [1] (🧎🏿‍♀️)
+1F9CE 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
kneeling: dark skin tone                                   # E12.0  [1] (🧎🏿‍♂️)
+1F9CF 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; deaf 
woman                                                     # E12.0  [1] (🧏‍♀️)
+1F9CF 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; deaf 
man                                                       # E12.0  [1] (🧏‍♂️)
+1F9CF 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
woman: light skin tone                                    # E12.0  [1] (🧏🏻‍♀️)
+1F9CF 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
man: light skin tone                                      # E12.0  [1] (🧏🏻‍♂️)
+1F9CF 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
woman: medium-light skin tone                             # E12.0  [1] (🧏🏼‍♀️)
+1F9CF 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
man: medium-light skin tone                               # E12.0  [1] (🧏🏼‍♂️)
+1F9CF 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
woman: medium skin tone                                   # E12.0  [1] (🧏🏽‍♀️)
+1F9CF 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
man: medium skin tone                                     # E12.0  [1] (🧏🏽‍♂️)
+1F9CF 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
woman: medium-dark skin tone                              # E12.0  [1] (🧏🏾‍♀️)
+1F9CF 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
man: medium-dark skin tone                                # E12.0  [1] (🧏🏾‍♂️)
+1F9CF 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
woman: dark skin tone                                     # E12.0  [1] (🧏🏿‍♀️)
+1F9CF 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; deaf 
man: dark skin tone                                       # E12.0  [1] (🧏🏿‍♂️)
+1F9D4 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman: 
beard                                                   # E13.1  [1] (🧔‍♀️)
+1F9D4 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man: 
beard                                                     # E13.1  [1] (🧔‍♂️)
+1F9D4 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
light skin tone, beard                                  # E13.1  [1] (🧔🏻‍♀️)
+1F9D4 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
light skin tone, beard                                    # E13.1  [1] (🧔🏻‍♂️)
+1F9D4 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-light skin tone, beard                           # E13.1  [1] (🧔🏼‍♀️)
+1F9D4 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-light skin tone, beard                             # E13.1  [1] (🧔🏼‍♂️)
+1F9D4 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium skin tone, beard                                 # E13.1  [1] (🧔🏽‍♀️)
+1F9D4 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium skin tone, beard                                   # E13.1  [1] (🧔🏽‍♂️)
+1F9D4 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-dark skin tone, beard                            # E13.1  [1] (🧔🏾‍♀️)
+1F9D4 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-dark skin tone, beard                              # E13.1  [1] (🧔🏾‍♂️)
+1F9D4 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman: 
dark skin tone, beard                                   # E13.1  [1] (🧔🏿‍♀️)
+1F9D4 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man: 
dark skin tone, beard                                     # E13.1  [1] (🧔🏿‍♂️)
+1F9D6 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
in steamy room                                           # E5.0   [1] (🧖‍♀️)
+1F9D6 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man in 
steamy room                                             # E5.0   [1] (🧖‍♂️)
+1F9D6 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in steamy room: light skin tone                          # E5.0   [1] (🧖🏻‍♀️)
+1F9D6 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
steamy room: light skin tone                            # E5.0   [1] (🧖🏻‍♂️)
+1F9D6 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in steamy room: medium-light skin tone                   # E5.0   [1] (🧖🏼‍♀️)
+1F9D6 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
steamy room: medium-light skin tone                     # E5.0   [1] (🧖🏼‍♂️)
+1F9D6 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in steamy room: medium skin tone                         # E5.0   [1] (🧖🏽‍♀️)
+1F9D6 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
steamy room: medium skin tone                           # E5.0   [1] (🧖🏽‍♂️)
+1F9D6 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in steamy room: medium-dark skin tone                    # E5.0   [1] (🧖🏾‍♀️)
+1F9D6 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
steamy room: medium-dark skin tone                      # E5.0   [1] (🧖🏾‍♂️)
+1F9D6 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in steamy room: dark skin tone                           # E5.0   [1] (🧖🏿‍♀️)
+1F9D6 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
steamy room: dark skin tone                             # E5.0   [1] (🧖🏿‍♂️)
+1F9D7 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
climbing                                                 # E5.0   [1] (🧗‍♀️)
+1F9D7 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
climbing                                                   # E5.0   [1] (🧗‍♂️)
+1F9D7 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
climbing: light skin tone                                # E5.0   [1] (🧗🏻‍♀️)
+1F9D7 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
climbing: light skin tone                                  # E5.0   [1] (🧗🏻‍♂️)
+1F9D7 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
climbing: medium-light skin tone                         # E5.0   [1] (🧗🏼‍♀️)
+1F9D7 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
climbing: medium-light skin tone                           # E5.0   [1] (🧗🏼‍♂️)
+1F9D7 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
climbing: medium skin tone                               # E5.0   [1] (🧗🏽‍♀️)
+1F9D7 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
climbing: medium skin tone                                 # E5.0   [1] (🧗🏽‍♂️)
+1F9D7 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
climbing: medium-dark skin tone                          # E5.0   [1] (🧗🏾‍♀️)
+1F9D7 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
climbing: medium-dark skin tone                            # E5.0   [1] (🧗🏾‍♂️)
+1F9D7 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
climbing: dark skin tone                                 # E5.0   [1] (🧗🏿‍♀️)
+1F9D7 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
climbing: dark skin tone                                   # E5.0   [1] (🧗🏿‍♂️)
+1F9D8 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
in lotus position                                        # E5.0   [1] (🧘‍♀️)
+1F9D8 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man in 
lotus position                                          # E5.0   [1] (🧘‍♂️)
+1F9D8 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in lotus position: light skin tone                       # E5.0   [1] (🧘🏻‍♀️)
+1F9D8 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
lotus position: light skin tone                         # E5.0   [1] (🧘🏻‍♂️)
+1F9D8 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in lotus position: medium-light skin tone                # E5.0   [1] (🧘🏼‍♀️)
+1F9D8 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
lotus position: medium-light skin tone                  # E5.0   [1] (🧘🏼‍♂️)
+1F9D8 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in lotus position: medium skin tone                      # E5.0   [1] (🧘🏽‍♀️)
+1F9D8 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
lotus position: medium skin tone                        # E5.0   [1] (🧘🏽‍♂️)
+1F9D8 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in lotus position: medium-dark skin tone                 # E5.0   [1] (🧘🏾‍♀️)
+1F9D8 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
lotus position: medium-dark skin tone                   # E5.0   [1] (🧘🏾‍♂️)
+1F9D8 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
in lotus position: dark skin tone                        # E5.0   [1] (🧘🏿‍♀️)
+1F9D8 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man in 
lotus position: dark skin tone                          # E5.0   [1] (🧘🏿‍♂️)
+1F9D9 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
mage                                                     # E5.0   [1] (🧙‍♀️)
+1F9D9 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
mage                                                       # E5.0   [1] (🧙‍♂️)
+1F9D9 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mage: light skin tone                                    # E5.0   [1] (🧙🏻‍♀️)
+1F9D9 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mage: light skin tone                                      # E5.0   [1] (🧙🏻‍♂️)
+1F9D9 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mage: medium-light skin tone                             # E5.0   [1] (🧙🏼‍♀️)
+1F9D9 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mage: medium-light skin tone                               # E5.0   [1] (🧙🏼‍♂️)
+1F9D9 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mage: medium skin tone                                   # E5.0   [1] (🧙🏽‍♀️)
+1F9D9 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mage: medium skin tone                                     # E5.0   [1] (🧙🏽‍♂️)
+1F9D9 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mage: medium-dark skin tone                              # E5.0   [1] (🧙🏾‍♀️)
+1F9D9 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mage: medium-dark skin tone                                # E5.0   [1] (🧙🏾‍♂️)
+1F9D9 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
mage: dark skin tone                                     # E5.0   [1] (🧙🏿‍♀️)
+1F9D9 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
mage: dark skin tone                                       # E5.0   [1] (🧙🏿‍♂️)
+1F9DA 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
fairy                                                    # E5.0   [1] (🧚‍♀️)
+1F9DA 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
fairy                                                      # E5.0   [1] (🧚‍♂️)
+1F9DA 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
fairy: light skin tone                                   # E5.0   [1] (🧚🏻‍♀️)
+1F9DA 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
fairy: light skin tone                                     # E5.0   [1] (🧚🏻‍♂️)
+1F9DA 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
fairy: medium-light skin tone                            # E5.0   [1] (🧚🏼‍♀️)
+1F9DA 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
fairy: medium-light skin tone                              # E5.0   [1] (🧚🏼‍♂️)
+1F9DA 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
fairy: medium skin tone                                  # E5.0   [1] (🧚🏽‍♀️)
+1F9DA 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
fairy: medium skin tone                                    # E5.0   [1] (🧚🏽‍♂️)
+1F9DA 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
fairy: medium-dark skin tone                             # E5.0   [1] (🧚🏾‍♀️)
+1F9DA 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
fairy: medium-dark skin tone                               # E5.0   [1] (🧚🏾‍♂️)
+1F9DA 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
fairy: dark skin tone                                    # E5.0   [1] (🧚🏿‍♀️)
+1F9DA 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
fairy: dark skin tone                                      # E5.0   [1] (🧚🏿‍♂️)
+1F9DB 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
vampire                                                  # E5.0   [1] (🧛‍♀️)
+1F9DB 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
vampire                                                    # E5.0   [1] (🧛‍♂️)
+1F9DB 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
vampire: light skin tone                                 # E5.0   [1] (🧛🏻‍♀️)
+1F9DB 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
vampire: light skin tone                                   # E5.0   [1] (🧛🏻‍♂️)
+1F9DB 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
vampire: medium-light skin tone                          # E5.0   [1] (🧛🏼‍♀️)
+1F9DB 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
vampire: medium-light skin tone                            # E5.0   [1] (🧛🏼‍♂️)
+1F9DB 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
vampire: medium skin tone                                # E5.0   [1] (🧛🏽‍♀️)
+1F9DB 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
vampire: medium skin tone                                  # E5.0   [1] (🧛🏽‍♂️)
+1F9DB 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
vampire: medium-dark skin tone                           # E5.0   [1] (🧛🏾‍♀️)
+1F9DB 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
vampire: medium-dark skin tone                             # E5.0   [1] (🧛🏾‍♂️)
+1F9DB 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
vampire: dark skin tone                                  # E5.0   [1] (🧛🏿‍♀️)
+1F9DB 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
vampire: dark skin tone                                    # E5.0   [1] (🧛🏿‍♂️)
+1F9DC 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; 
mermaid                                                        # E5.0   [1] 
(🧜‍♀️)
+1F9DC 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; merman 
                                                        # E5.0   [1] (🧜‍♂️)
+1F9DC 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
mermaid: light skin tone                                       # E5.0   [1] 
(🧜🏻‍♀️)
+1F9DC 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
merman: light skin tone                                        # E5.0   [1] 
(🧜🏻‍♂️)
+1F9DC 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
mermaid: medium-light skin tone                                # E5.0   [1] 
(🧜🏼‍♀️)
+1F9DC 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
merman: medium-light skin tone                                 # E5.0   [1] 
(🧜🏼‍♂️)
+1F9DC 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
mermaid: medium skin tone                                      # E5.0   [1] 
(🧜🏽‍♀️)
+1F9DC 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
merman: medium skin tone                                       # E5.0   [1] 
(🧜🏽‍♂️)
+1F9DC 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
mermaid: medium-dark skin tone                                 # E5.0   [1] 
(🧜🏾‍♀️)
+1F9DC 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
merman: medium-dark skin tone                                  # E5.0   [1] 
(🧜🏾‍♂️)
+1F9DC 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
mermaid: dark skin tone                                        # E5.0   [1] 
(🧜🏿‍♀️)
+1F9DC 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; 
merman: dark skin tone                                         # E5.0   [1] 
(🧜🏿‍♂️)
+1F9DD 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
elf                                                      # E5.0   [1] (🧝‍♀️)
+1F9DD 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
elf                                                        # E5.0   [1] (🧝‍♂️)
+1F9DD 1F3FB 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
elf: light skin tone                                     # E5.0   [1] (🧝🏻‍♀️)
+1F9DD 1F3FB 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
elf: light skin tone                                       # E5.0   [1] (🧝🏻‍♂️)
+1F9DD 1F3FC 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
elf: medium-light skin tone                              # E5.0   [1] (🧝🏼‍♀️)
+1F9DD 1F3FC 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
elf: medium-light skin tone                                # E5.0   [1] (🧝🏼‍♂️)
+1F9DD 1F3FD 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
elf: medium skin tone                                    # E5.0   [1] (🧝🏽‍♀️)
+1F9DD 1F3FD 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
elf: medium skin tone                                      # E5.0   [1] (🧝🏽‍♂️)
+1F9DD 1F3FE 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
elf: medium-dark skin tone                               # E5.0   [1] (🧝🏾‍♀️)
+1F9DD 1F3FE 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
elf: medium-dark skin tone                                 # E5.0   [1] (🧝🏾‍♂️)
+1F9DD 1F3FF 200D 2640 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; woman 
elf: dark skin tone                                      # E5.0   [1] (🧝🏿‍♀️)
+1F9DD 1F3FF 200D 2642 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; man 
elf: dark skin tone                                        # E5.0   [1] (🧝🏿‍♂️)
+1F9DE 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
genie                                                    # E5.0   [1] (🧞‍♀️)
+1F9DE 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
genie                                                      # E5.0   [1] (🧞‍♂️)
+1F9DF 200D 2640 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; woman 
zombie                                                   # E5.0   [1] (🧟‍♀️)
+1F9DF 200D 2642 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; man 
zombie                                                     # E5.0   [1] (🧟‍♂️)
+
+# Total elements: 572
+
+# ================================================
+
+# RGI_Emoji_ZWJ_Sequence: Hair
+
+1F468 200D 1F9B0                            ; RGI_Emoji_ZWJ_Sequence  ; man: 
red hair                                                  # E11.0  [1] (👨‍🦰)
+1F468 200D 1F9B1                            ; RGI_Emoji_ZWJ_Sequence  ; man: 
curly hair                                                # E11.0  [1] (👨‍🦱)
+1F468 200D 1F9B2                            ; RGI_Emoji_ZWJ_Sequence  ; man: 
bald                                                      # E11.0  [1] (👨‍🦲)
+1F468 200D 1F9B3                            ; RGI_Emoji_ZWJ_Sequence  ; man: 
white hair                                                # E11.0  [1] (👨‍🦳)
+1F468 1F3FB 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
light skin tone, red hair                                 # E11.0  [1] (👨🏻‍🦰)
+1F468 1F3FB 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
light skin tone, curly hair                               # E11.0  [1] (👨🏻‍🦱)
+1F468 1F3FB 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
light skin tone, bald                                     # E11.0  [1] (👨🏻‍🦲)
+1F468 1F3FB 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
light skin tone, white hair                               # E11.0  [1] (👨🏻‍🦳)
+1F468 1F3FC 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-light skin tone, red hair                          # E11.0  [1] (👨🏼‍🦰)
+1F468 1F3FC 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-light skin tone, curly hair                        # E11.0  [1] (👨🏼‍🦱)
+1F468 1F3FC 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-light skin tone, bald                              # E11.0  [1] (👨🏼‍🦲)
+1F468 1F3FC 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-light skin tone, white hair                        # E11.0  [1] (👨🏼‍🦳)
+1F468 1F3FD 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium skin tone, red hair                                # E11.0  [1] (👨🏽‍🦰)
+1F468 1F3FD 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium skin tone, curly hair                              # E11.0  [1] (👨🏽‍🦱)
+1F468 1F3FD 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium skin tone, bald                                    # E11.0  [1] (👨🏽‍🦲)
+1F468 1F3FD 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium skin tone, white hair                              # E11.0  [1] (👨🏽‍🦳)
+1F468 1F3FE 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-dark skin tone, red hair                           # E11.0  [1] (👨🏾‍🦰)
+1F468 1F3FE 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-dark skin tone, curly hair                         # E11.0  [1] (👨🏾‍🦱)
+1F468 1F3FE 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-dark skin tone, bald                               # E11.0  [1] (👨🏾‍🦲)
+1F468 1F3FE 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
medium-dark skin tone, white hair                         # E11.0  [1] (👨🏾‍🦳)
+1F468 1F3FF 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
dark skin tone, red hair                                  # E11.0  [1] (👨🏿‍🦰)
+1F468 1F3FF 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
dark skin tone, curly hair                                # E11.0  [1] (👨🏿‍🦱)
+1F468 1F3FF 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
dark skin tone, bald                                      # E11.0  [1] (👨🏿‍🦲)
+1F468 1F3FF 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; man: 
dark skin tone, white hair                                # E11.0  [1] (👨🏿‍🦳)
+1F469 200D 1F9B0                            ; RGI_Emoji_ZWJ_Sequence  ; woman: 
red hair                                                # E11.0  [1] (👩‍🦰)
+1F469 200D 1F9B1                            ; RGI_Emoji_ZWJ_Sequence  ; woman: 
curly hair                                              # E11.0  [1] (👩‍🦱)
+1F469 200D 1F9B2                            ; RGI_Emoji_ZWJ_Sequence  ; woman: 
bald                                                    # E11.0  [1] (👩‍🦲)
+1F469 200D 1F9B3                            ; RGI_Emoji_ZWJ_Sequence  ; woman: 
white hair                                              # E11.0  [1] (👩‍🦳)
+1F469 1F3FB 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
light skin tone, red hair                               # E11.0  [1] (👩🏻‍🦰)
+1F469 1F3FB 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
light skin tone, curly hair                             # E11.0  [1] (👩🏻‍🦱)
+1F469 1F3FB 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
light skin tone, bald                                   # E11.0  [1] (👩🏻‍🦲)
+1F469 1F3FB 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
light skin tone, white hair                             # E11.0  [1] (👩🏻‍🦳)
+1F469 1F3FC 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-light skin tone, red hair                        # E11.0  [1] (👩🏼‍🦰)
+1F469 1F3FC 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-light skin tone, curly hair                      # E11.0  [1] (👩🏼‍🦱)
+1F469 1F3FC 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-light skin tone, bald                            # E11.0  [1] (👩🏼‍🦲)
+1F469 1F3FC 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-light skin tone, white hair                      # E11.0  [1] (👩🏼‍🦳)
+1F469 1F3FD 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium skin tone, red hair                              # E11.0  [1] (👩🏽‍🦰)
+1F469 1F3FD 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium skin tone, curly hair                            # E11.0  [1] (👩🏽‍🦱)
+1F469 1F3FD 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium skin tone, bald                                  # E11.0  [1] (👩🏽‍🦲)
+1F469 1F3FD 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium skin tone, white hair                            # E11.0  [1] (👩🏽‍🦳)
+1F469 1F3FE 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-dark skin tone, red hair                         # E11.0  [1] (👩🏾‍🦰)
+1F469 1F3FE 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-dark skin tone, curly hair                       # E11.0  [1] (👩🏾‍🦱)
+1F469 1F3FE 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-dark skin tone, bald                             # E11.0  [1] (👩🏾‍🦲)
+1F469 1F3FE 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
medium-dark skin tone, white hair                       # E11.0  [1] (👩🏾‍🦳)
+1F469 1F3FF 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
dark skin tone, red hair                                # E11.0  [1] (👩🏿‍🦰)
+1F469 1F3FF 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
dark skin tone, curly hair                              # E11.0  [1] (👩🏿‍🦱)
+1F469 1F3FF 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
dark skin tone, bald                                    # E11.0  [1] (👩🏿‍🦲)
+1F469 1F3FF 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; woman: 
dark skin tone, white hair                              # E11.0  [1] (👩🏿‍🦳)
+1F9D1 200D 1F9B0                            ; RGI_Emoji_ZWJ_Sequence  ; 
person: red hair                                               # E12.1  [1] 
(🧑‍🦰)
+1F9D1 200D 1F9B1                            ; RGI_Emoji_ZWJ_Sequence  ; 
person: curly hair                                             # E12.1  [1] 
(🧑‍🦱)
+1F9D1 200D 1F9B2                            ; RGI_Emoji_ZWJ_Sequence  ; 
person: bald                                                   # E12.1  [1] 
(🧑‍🦲)
+1F9D1 200D 1F9B3                            ; RGI_Emoji_ZWJ_Sequence  ; 
person: white hair                                             # E12.1  [1] 
(🧑‍🦳)
+1F9D1 1F3FB 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: light skin tone, red hair                              # E12.1  [1] 
(🧑🏻‍🦰)
+1F9D1 1F3FB 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: light skin tone, curly hair                            # E12.1  [1] 
(🧑🏻‍🦱)
+1F9D1 1F3FB 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: light skin tone, bald                                  # E12.1  [1] 
(🧑🏻‍🦲)
+1F9D1 1F3FB 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: light skin tone, white hair                            # E12.1  [1] 
(🧑🏻‍🦳)
+1F9D1 1F3FC 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium-light skin tone, red hair                       # E12.1  [1] 
(🧑🏼‍🦰)
+1F9D1 1F3FC 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium-light skin tone, curly hair                     # E12.1  [1] 
(🧑🏼‍🦱)
+1F9D1 1F3FC 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium-light skin tone, bald                           # E12.1  [1] 
(🧑🏼‍🦲)
+1F9D1 1F3FC 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium-light skin tone, white hair                     # E12.1  [1] 
(🧑🏼‍🦳)
+1F9D1 1F3FD 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium skin tone, red hair                             # E12.1  [1] 
(🧑🏽‍🦰)
+1F9D1 1F3FD 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium skin tone, curly hair                           # E12.1  [1] 
(🧑🏽‍🦱)
+1F9D1 1F3FD 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium skin tone, bald                                 # E12.1  [1] 
(🧑🏽‍🦲)
+1F9D1 1F3FD 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium skin tone, white hair                           # E12.1  [1] 
(🧑🏽‍🦳)
+1F9D1 1F3FE 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium-dark skin tone, red hair                        # E12.1  [1] 
(🧑🏾‍🦰)
+1F9D1 1F3FE 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium-dark skin tone, curly hair                      # E12.1  [1] 
(🧑🏾‍🦱)
+1F9D1 1F3FE 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium-dark skin tone, bald                            # E12.1  [1] 
(🧑🏾‍🦲)
+1F9D1 1F3FE 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: medium-dark skin tone, white hair                      # E12.1  [1] 
(🧑🏾‍🦳)
+1F9D1 1F3FF 200D 1F9B0                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: dark skin tone, red hair                               # E12.1  [1] 
(🧑🏿‍🦰)
+1F9D1 1F3FF 200D 1F9B1                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: dark skin tone, curly hair                             # E12.1  [1] 
(🧑🏿‍🦱)
+1F9D1 1F3FF 200D 1F9B2                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: dark skin tone, bald                                   # E12.1  [1] 
(🧑🏿‍🦲)
+1F9D1 1F3FF 200D 1F9B3                      ; RGI_Emoji_ZWJ_Sequence  ; 
person: dark skin tone, white hair                             # E12.1  [1] 
(🧑🏿‍🦳)
+
+# Total elements: 72
+
+# ================================================
+
+# RGI_Emoji_ZWJ_Sequence: Other
+
+2764 FE0F 200D 1F525                        ; RGI_Emoji_ZWJ_Sequence  ; heart 
on fire                                                  # E13.1  [1] (❤️‍🔥)
+2764 FE0F 200D 1FA79                        ; RGI_Emoji_ZWJ_Sequence  ; 
mending heart                                                  # E13.1  [1] 
(❤️‍🩹)
+1F3F3 FE0F 200D 26A7 FE0F                   ; RGI_Emoji_ZWJ_Sequence  ; 
transgender flag                                               # E13.0  [1] 
(🏳️‍⚧️)
+1F3F3 FE0F 200D 1F308                       ; RGI_Emoji_ZWJ_Sequence  ; 
rainbow flag                                                   # E4.0   [1] 
(🏳️‍🌈)
+1F3F4 200D 2620 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; pirate 
flag                                                    # E11.0  [1] (🏴‍☠️)
+1F408 200D 2B1B                             ; RGI_Emoji_ZWJ_Sequence  ; black 
cat                                                      # E13.0  [1] (🐈‍⬛)
+1F415 200D 1F9BA                            ; RGI_Emoji_ZWJ_Sequence  ; 
service dog                                                    # E12.0  [1] 
(🐕‍🦺)
+1F43B 200D 2744 FE0F                        ; RGI_Emoji_ZWJ_Sequence  ; polar 
bear                                                     # E13.0  [1] (🐻‍❄️)
+1F441 FE0F 200D 1F5E8 FE0F                  ; RGI_Emoji_ZWJ_Sequence  ; eye in 
speech bubble                                           # E2.0   [1] (👁️‍🗨️)
+1F62E 200D 1F4A8                            ; RGI_Emoji_ZWJ_Sequence  ; face 
exhaling                                                  # E13.1  [1] (😮‍💨)
+1F635 200D 1F4AB                            ; RGI_Emoji_ZWJ_Sequence  ; face 
with spiral eyes                                          # E13.1  [1] (😵‍💫)
+1F636 200D 1F32B FE0F                       ; RGI_Emoji_ZWJ_Sequence  ; face 
in clouds                                                 # E13.1  [1] (😶‍🌫️)
+1F9D1 200D 1F384                            ; RGI_Emoji_ZWJ_Sequence  ; mx 
claus                                                       # E13.0  [1] (🧑‍🎄)
+
+# Total elements: 13
+
+#EOF
diff --git a/admin/unidata/emoji-zwj.awk b/admin/unidata/emoji-zwj.awk
new file mode 100644
index 0000000000..bdc50f5047
--- /dev/null
+++ b/admin/unidata/emoji-zwj.awk
@@ -0,0 +1,111 @@
+#!/usr/bin/awk -f
+
+## Copyright (C) 2020 Free Software Foundation, Inc.
+
+## Author: Robert Pluim <rpluim@gmail.com>
+
+## This file is part of GNU Emacs.
+
+## GNU Emacs is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+
+## GNU Emacs is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+### Commentary:
+
+## This script takes as input Unicode's emoji-zwj-sequences.txt
+## and produces output for Emacs's lisp/international/emoji-zwj.el.
+## It also outputs the composition sequences for flags, UK flags, and
+## skin tones which have been derived from emoji-sequences.txt by hand.
+
+## For additional details, see <https://debbugs.gnu.org/39799#8>.
+
+## Things to do after installing a new version of
+## emoji-zwj-sequences.txt and emoji-sequences.txt
+## Check the output against the old output.  See if there are any new
+## composition sequences in emoji-sequences.txt that that need to be
+## added Rebuild emacs, visit emoji-zwj-sequences.txt and
+## emoji-sequences.txt and check that the various sequences are being
+## composed properly.  Don't forget to install an appropriate font,
+## such as Noto Color Emoji.
+
+### Code:
+
+/^[0-9A-F]/ {
+    sub(/ *;.*/, "", $0)
+    num = split($0, elts)
+    if (ch[elts[1]] == "")
+    {
+        vec[elts[1]] = ""
+        ch[elts[1]] = elts[1]
+    }
+     else
+     {
+         vec[elts[1]] = vec[elts[1]] "\n"
+     }
+     vec[elts[1]] = vec[elts[1]] "\""
+    for (j = 1; j <= num; j++)
+    {
+        c = sprintf("\\N{U+%s}", elts[j])
+        vec[elts[1]] = vec[elts[1]] c
+    }
+    vec[elts[1]] = vec[elts[1]] "\""
+}
+
+END {
+     print ";;; emoji-zwj.el --- emoji zwj character composition table  -*- 
lexical-binding:t -*-"
+     print ";;; Automatically generated from 
admin/unidata/emoji-zwj-sequences.txt"
+     print "(eval-when-compile (require 'regexp-opt))"
+     print "(dolist (elt `("
+
+     for (elt in ch)
+    {
+        printf("(#x%s .\n,(eval-when-compile (regexp-opt\n'(\n%s\n))))\n", 
elt, vec[elt])
+    }
+     print "))"
+     print "  (set-char-table-range composition-function-table"
+     print "                        (car elt)"
+     print "                        (nconc (char-table-range 
composition-function-table (car elt))"
+     print "                               (list (vector (cdr elt)"
+     print "                                             0"
+     print "                                             
'compose-gstring-for-graphic)))))"
+
+     print ";; The following three blocks are derived by hand from 
emoji-sequences.txt"
+     print ";; FIXME: add support for Emoji_Keycap_Sequence once we learn how 
to respect FE0F/VS-16"
+     print ";; for ASCII characters."
+
+     print ";; Flags"
+     print "(set-char-table-range composition-function-table"
+     print "                      '(#x1F1E6 . #x1F1FF)"
+     print "                      (nconc (char-table-range 
composition-function-table '(#x1F1E6 . #x1F1FF))"
+     print "                             (list (vector 
\"[\\U0001F1E6-\\U0001F1FF][\\U0001F1E6-\\U0001F1FF]\""
+     print "                                           0"
+     print "                                    
'compose-gstring-for-graphic))))"
+
+     print ";; UK Flags"
+     print "(set-char-table-range composition-function-table"
+     print "                      #x1F3F4"
+     print "                      (nconc (char-table-range 
composition-function-table #x1F3F4)"
+     print "                             (list (vector 
\"\\U0001F3F4\\U000E0067\\U000E0062\\\\(?:\\U000E0065\\U000E006E\\U000E0067\\\\|\\U000E0073\\U000E0063\\U000E0074\\\\|\\U000E0077\\U000E006C\\U000E0073\\\\)\\U000E007F\""
+     print "                                           0"
+     print "                                    
'compose-gstring-for-graphic))))"
+
+     print ";; Skin tones"
+     print "(set-char-table-range composition-function-table"
+     print "                      '(#x1F3FB . #x1F3FF)"
+     print "                      (nconc (char-table-range 
composition-function-table '(#x1F3FB . #x1F3FF))"
+     print "                             (list (vector 
\".[\\U0001F3FB-\\U0001F3FF]\""
+     print "                                           1"
+     print "                                    
'compose-gstring-for-graphic))))"
+
+     print "\n"
+     print "(provide 'emoji-zwj)"
+}
diff --git a/configure.ac b/configure.ac
index 1146b581cd..f151dd551d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3838,9 +3838,13 @@ if test "${with_native_compilation}" != "no"; then
 
       if test -n "$HAVE_MACPORTS"; then
         # Determine which gcc version has been installed (gcc11, for
-        # instance).
+        # instance). Use the latest version, if more than one is
+        # available.  (We filter out the gcc4 packages, because they
+        # don't support jit, and they have names like "gcc49" that
+        # sort later than "gcc11".)
         PORT_PACKAGE=$(port installed active | grep '^ *gcc@<:@0-9@:>@* ' | \
-                            awk '{ print $1; }')
+                            awk '{ print $1; }' | grep -v 'gcc4@<:@0-9@:>@' | \
+                            sort -V | tail -n 1)
         if test -n "$PORT_PACKAGE"; then
           MAC_CFLAGS="-I$(dirname $(port contents $PORT_PACKAGE | \
                                            grep libgccjit.h))"
diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index 0caab681d3..4ee302fbf7 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -278,6 +278,15 @@ name is defined as a Lisp function.  Type @kbd{C-g} to 
cancel the
 @kbd{C-h f} command if you don't really want to view the
 documentation.
 
+@vindex help-enable-symbol-autoload
+  If you request help for an autoloaded function whose @code{autoload}
+form (@pxref{Autoload,,, elisp, The Emacs Lisp Reference Manual})
+doesn't provide a doc string, the @file{*Help*} buffer won't have any
+doc string to display.  In that case, if
+@code{help-enable-symbol-autoload} is non-@code{nil}, Emacs will try
+to load the file in which the function is defined to see whether
+there's a doc string there.
+
 @findex shortdoc-display-group
   You can get an overview of functions relevant for a particular topic
 by using the @kbd{M-x shortdoc-display-group} command.  This will
@@ -310,6 +319,14 @@ variable, or a face.  If the symbol has more than one 
definition, like
 it has both definition as a function and as a variable, this command
 will show the documentation of all of them, one after the other.
 
+@vindex completions-detailed
+  If the @code{completions-detailed} user option is non-@code{nil},
+some commands provide details about the possible values when
+displaying completions.  For instance, @kbd{C-h o TAB} will then
+include the first line of the doc string, and will also say whether
+each symbol is a function or a variable (and so on).  Which details
+are included varies depending on the command used.
+
 @node Apropos
 @section Apropos
 @cindex apropos
diff --git a/doc/emacs/kmacro.texi b/doc/emacs/kmacro.texi
index e713c6ef8c..16a97db54c 100644
--- a/doc/emacs/kmacro.texi
+++ b/doc/emacs/kmacro.texi
@@ -180,11 +180,11 @@ define it, so @kbd{C-u 4 C-x )} executes the macro 
immediately 3
 additional times.
 
 @findex kdb-macro-redisplay
-@kindex C-x C-k Q
+@kindex C-x C-k d
   While executing a long-running keyboard macro, it can sometimes be
 useful to trigger a redisplay (to show how far we've gotten).  The
-@kbd{C-x C-k Q} can be used for this.  As a not very useful example,
-@kbd{C-x ( M-f C-x C-k Q C-x )} will create a macro that will
+@kbd{C-x C-k d} command can be used for this.  As a not very useful
+example, @kbd{C-x ( M-f C-x C-k d C-x )} will create a macro that will
 redisplay once per iteration when saying @kbd{C-u 42 C-x e}.
 
 @node Keyboard Macro Ring
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index 4ee0f32bd5..7e8b0e5914 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -1769,8 +1769,13 @@ Replace}), and continues to the next match after you 
respond.  If your
 response causes Emacs to exit the query-replace loop, you can later
 continue with @w{@kbd{M-x fileloop-continue @key{RET}}}.
 
+@findex project-find-dir
+  The command @kbd{C-x p d} (@code{project-find-dir}) prompts you to
+choose a directory inside the current project, with completion.
+And opens a Dired buffer (@pxref{Dired}) listing the files in it.
+
 @findex project-dired
-  The command @kbd{C-x p d} (@code{project-dired}) opens a Dired
+  The command @kbd{C-x p D} (@code{project-dired}) opens a Dired
 buffer (@pxref{Dired}) listing the files in the current project's root
 directory.
 
@@ -1861,14 +1866,14 @@ records the list of known projects.  It defaults to the 
file
 @subsection Managing the Project List File
 
 @table @kbd
-@item M-x project-remove-known-project
+@item M-x project-forget-project
 Remove a known project from the @code{project-list-file}.
 @end table
 
-@findex project-remove-known-project
+@findex project-forget-project
   Normally Emacs automatically adds and removes projects to and from the
 @code{project-list-file}, but sometimes you may want to manually edit
-the available projects.  @kbd{M-x project-remove-known-project}
+the available projects.  @kbd{M-x project-forget-project}
 prompts you to choose one of the available projects, and then removes
 it from the file.
 
@@ -2280,6 +2285,11 @@ the match with @var{replacement}.  @xref{Identifier 
Search}.
 Refresh the contents of the @file{*xref*} buffer
 (@code{xref-revert-buffer}.
 
+@item M-,
+@findex xref-quit-and-pop-marker-stack
+Quit the window showing the @file{*xref*} buffer, and then jump to the
+previous Xref stack location (@code{xref-quit-and-pop-marker-stack}.
+
 @item q
 @findex xref-quit
 Quit the window showing the @file{*xref*} buffer (@code{xref-quit}).
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index e4322e361f..8a101f1150 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -222,6 +222,15 @@ going past the original starting point of the search, it 
changes to
 @samp{Overwrapped}, which means that you are revisiting matches that
 you have already seen.
 
+@vindex isearch-wrap-pause
+  You can control what happens when there are no more matches by
+customizing the @code{isearch-wrap-pause} user option.  If it is
+@code{t} (the default), signal an error.  (Repeating the search will
+wrap around.)  If @code{no}, issue a @code{ding} and wrap immediately
+after reaching the last match.  If @code{no-ding}, wrap immediately,
+but don't @code{ding}.  Finally, if @code{nil}, never wrap, but just
+stop at the last match.
+
 @cindex search ring
 @findex isearch-ring-advance
 @findex isearch-ring-retreat
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index ddd74d1245..3425880fec 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -3585,17 +3585,19 @@ commands.
 @cindex exit recursive editing
 @cindex aborting
   To invoke a recursive editing level, call the function
-@code{recursive-edit}.  This function contains the command loop; it also
-contains a call to @code{catch} with tag @code{exit}, which makes it
-possible to exit the recursive editing level by throwing to @code{exit}
-(@pxref{Catch and Throw}).  If you throw a @code{nil} value, then
-@code{recursive-edit} returns normally to the function that called it.
-The command @kbd{C-M-c} (@code{exit-recursive-edit}) does this.
-Throwing a @code{t} value causes @code{recursive-edit} to quit, so that
-control returns to the command loop one level up.  This is called
-@dfn{aborting}, and is done by @kbd{C-]} (@code{abort-recursive-edit}).
-You can also throw a function value.  In that case,
+@code{recursive-edit}.  This function contains the command loop; it
+also contains a call to @code{catch} with tag @code{exit}, which makes
+it possible to exit the recursive editing level by throwing to
+@code{exit} (@pxref{Catch and Throw}).  Throwing a @code{t} value
+causes @code{recursive-edit} to quit, so that control returns to the
+command loop one level up.  This is called @dfn{aborting}, and is done
+by @kbd{C-]} (@code{abort-recursive-edit}).  Similarly, you can throw
+a string value to make @code{recursive-edit} signal an error, printing
+this string as the message.  If you throw a function,
 @code{recursive-edit} will call it without arguments before returning.
+Throwing any other value, will make @code{recursive-edit} return
+normally to the function that called it.  The command @kbd{C-M-c}
+(@code{exit-recursive-edit}) does this.
 
   Most applications should not use recursive editing, except as part of
 using the minibuffer.  Usually it is more convenient for the user if you
diff --git a/doc/lispref/lists.texi b/doc/lispref/lists.texi
index bbe1dce42d..75641256b6 100644
--- a/doc/lispref/lists.texi
+++ b/doc/lispref/lists.texi
@@ -679,6 +679,20 @@ list are in the same order as in @var{tree}.
     @result{}(1 2 3 4 5 6 7)
 @end example
 
+@defun ensure-list object
+This function returns @var{object} as a list.  If @var{object} is
+already a list, the function returns it; otherwise, the function
+returns a one-element list containing @var{object}.
+
+This is usually useful if you have a variable that may or may not be a
+list, and you can then say, for instance:
+
+@lisp
+(dolist (elem (ensure-list foo))
+  (princ elem))
+@end lisp
+@end defun
+
 @defun number-sequence from &optional to separation
 This function returns a list of numbers starting with @var{from} and
 incrementing by @var{separation}, and ending at or just before
diff --git a/doc/lispref/searching.texi b/doc/lispref/searching.texi
index 68061f0b09..0dcf3889a5 100644
--- a/doc/lispref/searching.texi
+++ b/doc/lispref/searching.texi
@@ -2620,9 +2620,9 @@ replacement string.  The match data at this point are the 
result
 of matching @var{regexp} against a substring of @var{string}.
 @end defun
 
-@defun string-replace fromstring tostring instring
-This function replaces all occurrences of @var{fromstring} with
-@var{tostring} in @var{instring} and returns the result.  It may
+@defun string-replace from-string to-string in-string
+This function replaces all occurrences of @var{from-string} with
+@var{to-string} in @var{in-string} and returns the result.  It may
 return one of its arguments unchanged, a constant string or a new
 string.  Case is significant, and text properties are ignored.
 @end defun
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 26f85df160..679744884a 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -2081,6 +2081,11 @@ windows to search, and have the same meanings as in
 @code{next-window}.
 @end defun
 
+@defun window-bump-use-time window
+This function marks @var{window} as having been recently used.  This
+can be useful when creating certain @code{pop-to-buffer} scenarios.
+@end defun
+
 
 @node Buffers and Windows
 @section Buffers and Windows
diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi
index fc2e3f3b11..c01ceb5fb9 100644
--- a/doc/misc/eshell.texi
+++ b/doc/misc/eshell.texi
@@ -744,21 +744,33 @@ Eshell module.}  You also need to load the following as 
shown:
 @node Writing a module
 @section Writing a module
 
+This section is not yet written.
+
 @node Module testing
 @section Module testing
 
+This section is not yet written.
+
 @node Directory handling
 @section Directory handling
 
+This section is not yet written.
+
 @node Key rebinding
 @section Key rebinding
 
+This section is not yet written.
+
 @node Smart scrolling
 @section Smart scrolling
 
+This section is not yet written.
+
 @node Terminal emulation
 @section Terminal emulation
 
+This section is not yet written.
+
 @node Bugs and ideas
 @chapter Bugs and ideas
 @cindex reporting bugs and ideas
diff --git a/doc/misc/eww.texi b/doc/misc/eww.texi
index cc546a92d6..2543dc2ff5 100644
--- a/doc/misc/eww.texi
+++ b/doc/misc/eww.texi
@@ -228,7 +228,8 @@ in an external browser by customizing
 
 @findex eww-retrieve-command
   EWW normally uses @code{url-retrieve} to fetch the @acronym{HTML}
-before rendering it.  It can sometimes be convenient to use an
+before rendering it, and @code{url-retrieve-synchronously} when
+the value is @code{sync}.  It can sometimes be convenient to use an
 external program to do this, and @code{eww-retrieve-command} should
 then be a list that specifies a command and the parameters.  For
 instance, to use the Chromium browser, you could say something like
diff --git a/doc/misc/mh-e.texi b/doc/misc/mh-e.texi
index d2b81a634d..bc788ebae0 100644
--- a/doc/misc/mh-e.texi
+++ b/doc/misc/mh-e.texi
@@ -8114,7 +8114,7 @@ width is 4, so you would use @samp{(mh-set-cmd-note 4)}.
 @vindex mh-scan-format-nmh
 
 The default setting for @code{mh-scan-format-file} is @samp{Use MH-E
-scan Format}. This means that the format string will be taken from the
+scan Format}. This means that the format string will be taken from
 either @code{mh-scan-format-mh} or @code{mh-scan-format-nmh} depending
 on whether MH or nmh (or GNU mailutils MH) is in use. This setting
 also enables you to turn on the option
diff --git a/etc/AUTHORS b/etc/AUTHORS
index 3e91efb570..b599809e3e 100644
--- a/etc/AUTHORS
+++ b/etc/AUTHORS
@@ -5521,5 +5521,6 @@ Zoran Milojevic: changed avoid.el
 উৎসব রায়: changed quail/indian.el
 
 Local Variables:
+mode: etc-authors
 coding: utf-8
 End:
diff --git a/etc/NEWS b/etc/NEWS
index 634d3d86f9..1b67ef98b6 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -31,6 +31,11 @@ and also requires GCC and Binutils to be available when Lisp 
code is
 natively compiled.  See the Info node "(elisp) Native Compilation" for
 more details.
 
+If you build Emacs with native compilation, but without zlib, be sure
+to configure with the '--without-compress-install' option, so that the
+installed *.el files are not compressed; otherwise, you will not be
+able to use JIT native compilation of the installed *.el files.
+
 ** The Cairo graphics library is now used by default if present.
 '--with-cairo' is now the default, if the appropriate development files
 are found by 'configure'.  Note that building with Cairo means using
@@ -144,6 +149,13 @@ Emoji" by default for that script.  Use:
 
 to change the font used.
 
++++
+** Zero Width Joiner (ZWJ) and emoji sequences are now composed.
+Emacs can now compose (almost) all the Unicode-14 ZWJ and emoji
+sequences (if a suitable font is installed) so that they are displayed
+as single glyphs instead of multiple ones.  'Noto Color Emoji' is one
+such suitable font.
+
 +++
 ** New command 'execute-extended-command-for-buffer'.
 This new command, bound to 'M-S-x', works like
@@ -167,6 +179,7 @@ completion list popped up by 'M-x' shows the key bindings 
for all the
 commands shown in the list of candidate completions that have a key
 binding.
 
++++
 ** New user option 'completions-detailed'.
 When non-nil, some commands like 'describe-symbol' show more detailed
 completions with more information in completion prefix and suffix.
@@ -240,7 +253,7 @@ the user for whether that file should be deleted.  (Note 
that
 result in deletion of auto-save files when killing a buffer without
 unsaved changes, but this has apparently not worked for several
 decades, so the documented semantics of this variable has been changed
-to match the behaviour.)
+to match the behavior.)
 
 +++
 ** New user option 'next-error-message-highlight'.
@@ -294,6 +307,17 @@ personalize the uniquified buffer name.
 ---
 ** 'remove-hook' is now an interactive command.
 
+---
+** 'expand-file-name' now checks for null bytes in filenames.
+The function will now check for null bytes in both NAME and
+DEFAULT-DIRECTORY arguments, as well as in the 'default-directory'
+buffer-local variable, when its value is used.  If null bytes are
+found, 'expand-file-name' will signal an error.
+This means that practically all file-related operations will now check
+file names for null bytes, thus avoiding subtle bugs with silently
+using only the part of file name up to the first null byte.
+
+---
 ** Frames
 
 +++
@@ -363,11 +387,13 @@ This is like 'display-buffer-use-some-window', but won't 
reuse the
 current window, and when called repeatedly will try not to reuse a
 previously selected window.
 
++++
 *** New function 'window-bump-use-time'.
 This updates the use time of a window.
 
 ** Minibuffer
 
++++
 *** Minibuffer scrolling is now conservative by default.
 This is controlled by the new variable 'scroll-minibuffer-conservatively'.
 It is t by default; setting it to nil will cause scrolling in the
@@ -419,6 +445,7 @@ both modes are on).
 
 ** Tab Bars and Tab Lines
 
++++
 *** The prefix key 'C-x t t' can be used to display a buffer in a new tab.
 Typing 'C-x t t' before a command will cause the buffer shown by that
 command to be displayed in a new tab.  'C-x t t" is bound to the
@@ -532,6 +559,7 @@ The value is saved in the user option 
'mouse-wheel-scroll-amount-horizontal'.
 ---
 *** Customize buffers can now be reverted with 'C-x x g'.
 
+---
 *** Most customize commands now hide obsolete user options.
 Obsolete user options are no longer shown in the listings produced by
 the commands 'customize', 'customize-group', 'customize-apropos' and
@@ -540,6 +568,7 @@ the commands 'customize', 'customize-group', 
'customize-apropos' and
 To customize obsolete user options, use 'customize-option' or
 'customize-saved'.
 
+---
 *** New SVG icons for checkboxes and arrows.
 They will be used automatically instead of the old icons.  If Emacs is
 built without SVG support, the old icons will be used instead.
@@ -560,6 +589,7 @@ commands and is globally bound to 'C-h x'.
 +++
 *** New command 'describe-keymap' describes keybindings in a keymap.
 
+---
 *** New command 'apropos-function'.
 This works like 'C-u M-x apropos-command' but is more discoverable.
 
@@ -575,6 +605,13 @@ be assumed to be a propertized string.
 Note that the new face will also be used in tooltips.  When using the
 GTK toolkit, this is only true if 'x-gtk-use-system-tooltips' is t.
 
++++
+*** New user option 'help-enable-symbol-autoload'.
+If non-nil, displaying help for an autoloaded function whose
+'autoload' form provides no documentation string will try to load the
+file it's from.  This will give more extensive help for such
+functions.
+
 ---
 *** The 'help-for-help' ('C-h C-h') screen has been redesigned.
 
@@ -596,6 +633,7 @@ can provide a better overview in a long list of available 
bindings.
 It allows users to change the maximum number of keystrokes and
 commands recorded for the purpose of 'view-lossage'.
 
++++
 *** New commands to describe buttons and widgets.
 'widget-describe' (on a widget) will pop up a help buffer and give a
 description of the properties.  Likewise 'button-describe' does the
@@ -607,6 +645,7 @@ Now clicking on the link to find the definition of 
functions generated
 by 'cl-defstruct', or variables generated by 'define-derived-mode',
 for example, will go to the exact place where they are defined.
 
+---
 *** New commands 'apropos-next-symbol' and 'apropos-previous-symbol'.
 These new navigation commands are bound to 'n' and 'p' in
 'apropos-mode'.
@@ -680,13 +719,14 @@ summary of where Emacs is using memory currently.
 This works like 'report-emacs-bug', but is more geared towards sending
 patches to the Emacs issue tracker.
 
+---
 *** New face 'apropos-button'.
 Applies to buttons that indicate a face.
 
 +++
 *** New face 'font-lock-doc-markup-face'.
 Intended for documentation mark-up syntax and tags inside text that
-uses 'font-lock-doc-face', with which it should harmonise.  It would
+uses 'font-lock-doc-face', with which it should harmonize.  It would
 typically be used in structured documentation comments in program
 source code by language-specific modes, for mark-up conventions like
 Haddock, Javadoc or Doxygen.  By default this face inherits from
@@ -807,11 +847,22 @@ leak information from the reporting user.
 *** Rudimentary support for the 'st' terminal emulator.
 Emacs now supports 256 color display on the 'st' terminal emulator.
 
----
-*** Prefer "chat.freenode.net" to "irc.freenode.net".
-"chat.freenode.net" has been the preferred address for connecting to the
-freenode IRC network for years now.  Occurrences of "irc.freenode.net"
-have been replaced with "chat.freenode.net" throughout Emacs.
++++
+*** Update IRC-related references to point to Libera.Chat.
+The Free Software Foundation and the GNU Project have moved their
+official IRC channels from the Freenode network to Libera.Chat.  For the
+original announcement and the follow-up update, including more details,
+see:
+
+https://lists.gnu.org/archive/html/info-gnu/2021-06/msg00005.html
+https://lists.gnu.org/archive/html/info-gnu/2021-06/msg00007.html
+
+Given the relocation of GNU and FSF's official IRC channels, as well
+as #emacs and various other Emacs-themed channels (see the link below)
+to Libera.Chat, IRC-related references in the Emacs repository have
+now been updated to point to Libera.Chat.
+
+https://lists.gnu.org/archive/html/info-gnu-emacs/2021-06/msg00000.html
 
 
 * Editing Changes in Emacs 28.1
@@ -996,12 +1047,15 @@ Set the variable 'auto-save-visited-mode' buffer-locally 
to nil to
 achieve that.
 
 +++
-** New command 'C-x C-k Q' to force redisplay in keyboard macros.
+** New command 'kdb-macro-redisplay' to force redisplay in keyboard macros.
+This command is bound to 'C-x C-k d'.
 
+---
 ** 'blink-cursor-mode' is now enabled by default regardless of the UI.
 It used to be enabled when Emacs is started in GUI mode but not when started
 in text mode.  The cursor still only actually blinks in GUI frames.
 
++++
 ** New minor mode 'show-paren-local-mode'.
 It serves as a local counterpart for 'show-paren-mode', allowing you
 to toggle it separately in different buffers.
@@ -1028,6 +1082,7 @@ distinguish between sub-expression highlighting.
 Like 'search-highlight-submatches', this is controlled by the new user option
 'query-replace-highlight-submatches'.
 
++++
 *** New user option 'isearch-wrap-pause' defines how to wrap the search.
 There are choices to disable wrapping completely and to wrap immediately.
 When wrapping immediately, it consistently handles the numeric arguments
@@ -1217,7 +1272,7 @@ Clicking the dictionary name changes the current 
dictionary.
 ** Package
 
 *** The new NonGNU ELPA archive is enabled by default alongside GNU ELPA.
-Thus, packages on nonGNU ELPA will appear by default in the list shown
+Thus, packages on NonGNU ELPA will appear by default in the list shown
 by 'list-packages'.
 
 ---
@@ -2273,7 +2328,8 @@ This is a regexp that can be set to alter how links are 
followed in eww.
 +++
 *** New user option 'eww-retrieve-command'.
 This can be used to download data via an external command.  If nil
-(the default), then 'url-retrieve' is used.
+(the default), then 'url-retrieve' is used.  When 'sync', then
+'url-retrieve-synchronously' is used.
 
 +++
 *** New Emacs command line convenience command.
@@ -2354,10 +2410,21 @@ project's root directory, respectively.
 This specifies the file in which to save the list of known projects.
 
 +++
-*** New command 'project-remove-known-project'.
-This command lets you interactively remove an entry from the list of projects
+*** New command 'project-remember-projects-under'.
+This command can automatically locate and index projects in a
+directory and optionally also its subdirectories, storing them in
+'project-list-file'.
+
++++
+*** New commands 'project-forget-project' and 'project-forget-projects-under'.
+These command lets you interactively remove entries from the list of projects
 in 'project-list-file'.
 
++++
+*** New command 'project-forget-zombie-projects'.
+This command detects indexed projects that have since been deleted,
+and removes them from the list of known projects in 'project-list-file'.
+
 ---
 *** 'project-find-file' now accepts non-existent file names.
 This is to allow easy creation of files inside some nested
@@ -2367,6 +2434,9 @@ sub-directory.
 *** 'project-find-file' doesn't use the string at point as default input.
 Now it's only suggested as part of the "future history".
 
++++
+*** New command 'project-find-dir' runs Dired in a directory inside project.
+
 ** Xref
 
 ---
@@ -2408,10 +2478,12 @@ have been renamed to have "proper" public names and 
documented
 ('xref-show-definitions-buffer' and
 'xref-show-definitions-buffer-at-bottom').
 
-*** New command 'xref-quit-and-pop-marker-stack' and a binding for it
-in "*xref*" buffers ('M-,').  This combination is easy to press
-semi-accidentally if the user wants to go back in the middle of
-choosing the exact definition to go to, and this should do TRT.
++++
+*** New command 'xref-quit-and-pop-marker-stack'.
+This command is bound to 'M-,' in "*xref*" buffers.  This combination
+is easy to press semi-accidentally if the user wants to go back in the
+middle of choosing the exact definition to go to, and this should do
+TRT.
 
 ---
 *** New value 'project-relative' for 'xref-file-name-display'.
@@ -2430,6 +2502,7 @@ binding in 'xref--xref-buffer-mode-map'.
 When non-nil, matches for identifiers in the file visited by the
 current buffer will be shown first in the "*xref*" buffer.
 
++++
 *** The etags Xref backend now honors 'tags-apropos-additional-actions'.
 You can customize it to augment the output of 'xref-find-apropos',
 like it affected the output of 'tags-apropos', which is obsolete since
@@ -2513,6 +2586,12 @@ This new command (bound to 'C-c C-l') regenerates the 
current hunk.
 This is like 'filename', but is a full path, and is nil if the file
 doesn't exist.
 
+*** New 'thing-at-point' target: 'list-or-string'.
+This is like 'list, but if point is inside a string that's enclosed in
+the list, it returns the enclosed string and not the enclosing list.
+
+This is like 'list', but also prefers to find of any enclosing string.
+
 +++
 *** New variable 'thing-at-point-provider-alist'.
 This allows mode-specific alterations to how 'thing-at-point' works.
@@ -2682,6 +2761,7 @@ The 'erc-current-nick-highlight-type', 
'erc-pal-highlight-type',
 'erc-dangerous-host-highlight-type' variables now support a 'message'
 type for highlighting the entire message but not the sender's nick.
 
+---
 *** erc-status-sidebar.el is now part of ERC.
 The 'erc-status-sidebar' package which provides a HexChat-like
 activity overview sidebar for joined IRC channels is now part of ERC.
@@ -2703,28 +2783,71 @@ declared obsolete and rewritten as 
'erc-track-select-mode-line-face',
 with different expected arguments (the current and old faces are now
 separated) and clearer documentation.
 
+*** Add '/opme' and '/deopme' convenience commands.
+The new '/opme' convenience command asks ChanServ to set the operator
+status for the current nick in the current channel, and '/deopme'
+unsets it.
+
 ** xwidget-webkit mode
 
+---
 *** New xwidget commands.
 'xwidget-webkit-uri' (return the current URL), 'xwidget-webkit-title'
 (return the current title), and 'xwidget-webkit-goto-history' (goto a
 point in history).
 
+---
 *** Pixel-based scrolling.
 The 'xwidget-webkit-scroll-up', 'xwidget-webkit-scroll-down' commands
 now supports scrolling arbitrary pixel values.  It now treats the
 optional 2nd argument as the pixel values to scroll.
 
+---
 *** New commands for scrolling.
 The new commands 'xwidget-webkit-scroll-up-line',
 'xwidget-webkit-scroll-down-line', 'xwidget-webkit-scroll-forward',
 'xwidget-webkit-scroll-backward' can be used to scroll webkit by the
 height of lines or width of chars.
 
+---
 *** New user option 'xwidget-webkit-bookmark-jump-new-session'.
 When non-nil, use a new xwidget webkit session after bookmark jump.
 Otherwise, it will use 'xwidget-webkit-last-session'.
 
+** Checkdoc
+
+---
+*** No longer warns about command substitutions by default.
+Checkdoc used to warn about "too many command substitutions" (as in
+"\\[foo-command]"), even if you only used ten of them in a docstring.
+On modern machines, you can have hundreds or thousands of command
+substitutions before it becomes a performance issue, so this warning
+is now disabled by default.  To re-enable this warning, customize the
+user option 'checkdoc-max-keyref-before-warn'.
+
+---
+*** New user option 'checkdoc-column-zero-backslash-before-paren'.
+Checkdoc warns if there is a left parenthesis in column zero of a
+documentation string.  That warning can now be disabled by customizing
+this new user option to nil.  This is useful if you don't expect
+your code to be edited with an Emacs older than version 27.1.
+
+---
+*** Now checks the prompt format for 'yes-or-no-p'.
+In addition to verifying the format of the prompt for 'y-or-n-p',
+checkdoc will now check the format of 'yes-or-no-p'.
+
+---
+*** New command 'checkdoc-dired'.
+This can be used to run checkdoc on files from a Dired buffer.
+
+---
+*** No longer checks for "A-" modifiers.
+Checkdoc recommends usage of command substitutions ("\\[foo-command]")
+in favor of writing keybindings like "C-c f".  It now no longer warns
+about the "A-" modifier as it is not used very much in practice, and
+this warning therefore mostly led to false positives.
+
 ** Enriched mode
 
 ---
@@ -2867,9 +2990,10 @@ point leaves the text.  If nil, the text is not hidden 
again.  Instead
 'M-x reveal-hide-revealed' can be used to hide all the revealed text.
 
 ---
-*** New variable 'ffap-file-name-with-spaces'.
+*** New user option 'ffap-file-name-with-spaces'.
 If non-nil, 'find-file-at-point' and friends will try to guess more
-expansively to identify a file name with spaces.
+expansively to identify a file name with spaces.  Default value is
+nil.
 
 ---
 *** Two new commands for centering in 'doc-view-mode'.
@@ -2896,19 +3020,13 @@ after every monthly meeting which takes place on the 
third Thursday,
 or if you would like to attend a virtual meeting scheduled in a
 different timezone causing a difference in the date.
 
----
-*** New user option 'checkdoc-column-zero-backslash-before-paren'.
-Checkdoc warns if there is a left parenthesis in column zero of a
-documentation string.  That warning can now be disabled by customizing
-this new user option to nil.  This can be useful if you don't expect
-your code to be edited with an Emacs version older than 27.1.
-
 ---
 *** The old non-SMIE indentation of 'sh-mode' has been removed.
 
 ---
 *** 'mspools-show' is now autoloaded.
 
+---
 *** Loading dunnet.el in batch mode doesn't start the game any more.
 Instead you need to do "emacs -f dun-batch" to start the game in
 batch mode.
@@ -2952,6 +3070,7 @@ direction with e.g. 'C-x o M-- o o'.  Also it can help to 
set a new
 step with e.g. 'C-x { C-5 { { {', which will set the window resizing
 step to 5 columns.
 
+---
 ** New themes 'modus-vivendi' and 'modus-operandi'.
 These themes are designed to conform with the highest standard for
 color-contrast accessibility (WCAG AAA).  You can load either of them
@@ -2985,9 +3104,14 @@ complex menus take advantage of infix arguments, which 
are somewhat
 similar to prefix arguments, but are more flexible and discoverable.
 
 ** hierarchy.el
-It's a library to create, query, navigate and display hierarchical
+This library can create, query, navigate and display hierarchical
 structures.
 
+---
+** New major mode for displaying the "etc/AUTHORS" file.
+This new 'etc-authors-mode' provides font-locking for displaying the
+"etc/AUTHORS" file from the Emacs distribution, and not much else.
+
 
 * Incompatible Editing Changes in Emacs 28.1
 
@@ -3465,6 +3589,9 @@ still being used by 'find-library' and related commands, 
so the
 variable has been renamed to 'find-library-source-path', and
 'find-function-source-path' is now an obsolete variable alias.
 
+---
+** The macro 'vc-call' no longer evaluates its second argument twice.
+
 
 * Lisp Changes in Emacs 28.1
 
@@ -3622,6 +3749,12 @@ and well-behaved enough to lose the "internal" marker.
 
 ** map.el
 
+---
+*** Alist keys are now consistently compared with 'equal' by default.
+Until now, 'map-elt' and 'map-delete' compared alist keys with 'eq' by
+default.  They now use 'equal' instead, for consistency with
+'map-put!' and 'map-contains-key'.
+
 *** Pcase 'map' pattern added keyword symbols abbreviation.
 A pattern like '(map :sym)' binds the map's value for ':sym' to 'sym',
 equivalent to '(map (:sym sym))'.
@@ -3724,6 +3857,11 @@ This function works along the line of 
'replace-regexp-in-string', but
 it matches on fixed strings instead of regexps, and does not change
 the global match state.
 
++++
+** New function 'ensure-list'.
+This function makes a list of its object if it's not a list already.
+If it's already a list, the list is returned as is.
+
 +++
 ** New function 'split-string-shell-command'.
 This splits a shell command string into separate components,
@@ -4121,8 +4259,9 @@ do not support the old calling conventions any longer.
 
 +++
 ** 'yes-or-no-p' and 'y-or-n-p' PROMPT parameter no longer needs trailing 
space.
-This has been the case since Emacs 24.4 but was not announced or
-documented until now.
+In other words, the prompt can now end with "?" instead of "? ".  This
+has been the case since Emacs 24.4 but was not announced or documented
+until now.  (Checkdoc has also been updated to accept this convention.)
 
 +++
 ** The 'uniquify' argument in 'auto-save-file-name-transforms' can be a symbol.
@@ -4131,12 +4270,6 @@ Emacs constructs the nondirectory part of the auto-save 
file name by
 applying that 'secure-hash' to the buffer file name.  This avoids any
 risk of excessively long file names.
 
----
-** File names checked for null bytes.
-Functions operating on local file names now check that the file names
-don't contain any NUL bytes.  This avoids subtle bugs caused by
-silently using only the part of the file name until the first NUL byte.
-
 +++
 ** New user option 'process-file-return-signal-string'.
 It controls, whether 'process-file' returns a string when a remote
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index f90418798d..42d714bf1e 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -2671,6 +2671,24 @@ something like the following in your init file:
 
 (push "\\`-[^-]*-monaco-bold-" face-ignored-fonts)
 
+** Native Compilation on macOS
+
+Native complitation requires the libgccjit library to be installed and
+its path available to Emacs.  Errors such as:
+
+    libgccjit.so: error: error invoking gcc driver
+    Error: Internal native compiler error failed to compile
+
+indicate Emacs can't find the library in running time.  One can set
+the "LIBRARY_PATH" environment variable in the early initalization
+file; for example:
+
+(setenv "LIBRARY_PATH"
+  (string-join
+    '("/usr/local/opt/gcc/lib/gcc/11"
+      "/usr/local/opt/libgccjit/lib/gcc/11"
+      "/usr/local/opt/gcc/lib/gcc/11/gcc/x86_64-apple-darwin20/11.2.0") ":"))
+
 * Build-time problems
 
 ** Configuration
diff --git a/etc/refcards/refcard.tex b/etc/refcards/refcard.tex
index ae39a4e9f7..bc057569a7 100644
--- a/etc/refcards/refcard.tex
+++ b/etc/refcards/refcard.tex
@@ -273,13 +273,15 @@ see the Emacs distribution, or {\tt 
https://www.gnu.org/software/emacs}
 
 \centerline{(for version \versionemacs)}
 
-\section{Starting Emacs}
+\section{Key Binding Notation}
 
-To enter GNU Emacs \versionemacs, just type its name: \kbd{emacs}
+In the Emacs key binding notation, \kbd{C-x}
+is \kbd{Ctrl+X}; \kbd{M-x} is usually \kbd{Alt+X}; \kbd{S-x} is
+\kbd{Shift+X}; and \kbd{C-M-x} is \kbd{Ctrl+Alt+X}, etc.
 
 \section{Leaving Emacs}
 
-\key{suspend Emacs (or iconify it under X)}{C-z}
+\key{iconify Emacs (or suspend it in terminal)}{C-z}
 \key{exit Emacs permanently}{C-x C-c}
 
 \section{Files}
diff --git a/lisp/align.el b/lisp/align.el
index 2f380a8077..7ced7b7044 100644
--- a/lisp/align.el
+++ b/lisp/align.el
@@ -897,22 +897,24 @@ align them so that the opening parentheses would line up:
     Mary-Anne (123) 456-7890
     Joe (123) 456-7890
 
-There is no predefined rule to handle this, but you could easily do it
-using a REGEXP like \"(\".  Interactively, all you would have to do is
-to mark the region, call `align-regexp' and enter that regular expression.
-
-REGEXP must contain at least one parenthesized subexpression, typically
-whitespace of the form \"\\\\(\\\\s-*\\\\)\".  In normal interactive use,
-this is automatically added to the start of your regular expression after
-you enter it.  You only need to supply the characters to be lined up, and
-any preceding whitespace is replaced.
-
-If you specify a prefix argument (or use this function non-interactively),
-you must enter the full regular expression, including the subexpression.
-The function also then prompts for which subexpression parenthesis GROUP
-\(default 1) within REGEXP to modify, the amount of SPACING (default
-`align-default-spacing') to use, and whether or not to REPEAT the rule
-throughout the line.
+There is no predefined rule to handle this, but interactively,
+all you would have to do is to mark the region, call `align-regexp'
+and enter \"(\".
+
+REGEXP must contain at least one parenthesized subexpression,
+typically whitespace of the form \"\\\\(\\\\s-*\\\\)\", but in
+interactive use, this is automatically added to the start of your
+regular expression after you enter it.  Interactively, you only
+need to supply the characters to be lined up, and any preceding
+whitespace is replaced.
+
+Non-interactively (or if you specify a prefix argument), you must
+enter the full regular expression, including the subexpression.
+Interactively, the function also then prompts for which
+subexpression parenthesis GROUP (default 1) within REGEXP to
+modify, the amount of SPACING (default `align-default-spacing')
+to use, and whether or not to REPEAT the rule throughout the
+line.
 
 See `align-rules-list' for more information about these options.
 
diff --git a/lisp/allout.el b/lisp/allout.el
index bb36524658..c123e8ded4 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -116,7 +116,7 @@ Do NOT set the value of this variable.  Instead, customize
   "Create the allout keymap according to the keybinding specs, and set it.
 
 Useful standalone or to effect customizations of the
-respective allout-mode keybinding variables, `allout-command-prefix',
+respective `allout-mode' keybinding variables, `allout-command-prefix',
 `allout-prefixed-keybindings', and `allout-unprefixed-keybindings'"
   ;; Set the customization variable, if any:
   (when varname
@@ -145,7 +145,7 @@ respective allout-mode keybinding variables, 
`allout-command-prefix',
     (allout-institute-keymap map)))
 ;;;_  > allout-institute-keymap (map)
 (defun allout-institute-keymap (map)
-  "Associate allout-mode bindings with allout as a minor mode."
+  "Associate `allout-mode' bindings with allout as a minor mode."
   ;; Architecture:
   ;; allout-mode-map var is a keymap by virtue of being a defalias for
   ;; allout-mode-map-value, which has the actual keymap value.
@@ -358,7 +358,7 @@ Examples:
 See `allout-expose-topic' for more about the exposure process.
 
 Also, allout's mode-specific provisions will make topic prefixes default
-to the comment-start string, if any, of the language of the file.  This
+to the `comment-start' string, if any, of the language of the file.  This
 is modulo the setting of `allout-use-mode-specific-leader', which see."
   :type 'allout-layout-type
   :group 'allout)
@@ -429,8 +429,7 @@ those that do not have the variable `comment-start' set.  A 
value of
 
 ;;;_  = allout-show-bodies
 (defcustom allout-show-bodies nil
-  "If non-nil, show entire body when exposing a topic, rather than
-just the header."
+  "If non-nil, show entire body when exposing a topic, rather than just the 
header."
   :type 'boolean
   :group 'allout)
 (make-variable-buffer-local 'allout-show-bodies)
@@ -596,16 +595,16 @@ strings."
   "When non-nil, use mode-specific topic-header prefixes.
 
 Allout outline mode will use the mode-specific `allout-mode-leaders' or
-comment-start string, if any, to lead the topic prefix string, so topic
+`comment-start' string, if any, to lead the topic prefix string, so topic
 headers look like comments in the programming language.  It will also use
-the comment-start string, with an `_' appended, for `allout-primary-bullet'.
+the `comment-start' string, with an `_' appended, for `allout-primary-bullet'.
 
 String values are used as literals, not regular expressions, so
 do not escape any regular-expression characters.
 
 Value t means to first check for assoc value in `allout-mode-leaders'
-alist, then use comment-start string, if any, then use default (`.').
-\(See note about use of comment-start strings, below.)
+alist, then use `comment-start' string, if any, then use default (`.').
+\(See note about use of `comment-start' strings, below.)
 
 Set to the symbol for either of `allout-mode-leaders' or
 `comment-start' to use only one of them, respectively.
@@ -613,9 +612,9 @@ Set to the symbol for either of `allout-mode-leaders' or
 Value nil means to always use the default (`.') and leave
 `allout-primary-bullet' unaltered.
 
-comment-start strings that do not end in spaces are tripled in
+`comment-start' strings that do not end in spaces are tripled in
 the header-prefix, and an `_' underscore is tacked on the end, to
-distinguish them from regular comment strings.  comment-start
+distinguish them from regular comment strings.  `comment-start'
 strings that do end in spaces are not tripled, but an underscore
 is substituted for the space.  [This presumes that the space is
 for appearance, not comment syntax.  You can use
@@ -633,8 +632,8 @@ undesired.]"
 (defvar allout-mode-leaders '()
   "Specific allout-prefix leading strings per major modes.
 
-Use this if the mode's comment-start string isn't what you
-prefer, or if the mode lacks a comment-start string.  See
+Use this if the mode's `comment-start' string isn't what you
+prefer, or if the mode lacks a `comment-start' string.  See
 `allout-use-mode-specific-leader' for more details.
 
 If you're constructing a string that will comment-out outline
@@ -860,7 +859,7 @@ For details, see 
`allout-toggle-current-subtree-encryption's docstring."
 ;;;_  : Version
 ;;;_   = allout-version
 (defvar allout-version "2.3"
-  "Version of currently loaded outline package.  (allout.el)")
+  "Version of currently loaded allout.el package.")
 ;;;_   > allout-version
 (defun allout-version (&optional here)
   "Return string describing the loaded outline version."
@@ -1509,7 +1508,7 @@ See `allout-encryption-ciphertext-rejection-regexps' for 
rejection reasons.")
   'allout-mode)
 ;;;_   > allout-write-contents-hook-handler ()
 (defun allout-write-contents-hook-handler ()
-  "Implement `allout-encrypt-unencrypted-on-saves' for file writes
+  "Implement `allout-encrypt-unencrypted-on-saves' for file writes.
 
 Return nil if all goes smoothly, or else return an informative
 message if an error is encountered.  The message will serve as a
@@ -3998,8 +3997,7 @@ With repeat count, shift topic depth by that amount."
                                                index
                                                do-successors
                                                sans-offspring)
-  "Like `allout-rebullet-topic', but on nearest containing topic
-\(visible or not).
+  "Like `allout-rebullet-topic', but on nearest containing topic (visible or 
not).
 
 See `allout-rebullet-heading' for rebulleting behavior.
 
@@ -5056,8 +5054,7 @@ Examples:
       max-pos)))
 ;;;_   > allout-old-expose-topic (spec &rest followers)
 (defun allout-old-expose-topic (spec &rest followers)
-  "Deprecated.  Use `allout-expose-topic' (with different schema
-format) instead.
+  "Deprecated.  Use `allout-expose-topic' (with different schema format) 
instead.
 
 Dictate wholesale exposure scheme for current topic, according to SPEC.
 
diff --git a/lisp/ansi-color.el b/lisp/ansi-color.el
index 79b1c9912f..4315a7f3ce 100644
--- a/lisp/ansi-color.el
+++ b/lisp/ansi-color.el
@@ -604,7 +604,7 @@ codes.      Finally, the so changed list of codes is 
returned."
     codes))
 
 (defun ansi-color-make-color-map ()
-  "Creates a vector of face definitions and returns it.
+  "Create a vector of face definitions and return it.
 
 The index into the vector is an ANSI code.  See the documentation of
 `ansi-color-map' for an example.
diff --git a/lisp/apropos.el b/lisp/apropos.el
index 513175d751..fc15cd3e01 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -1305,7 +1305,7 @@ as a heading."
        (error "There is nothing to follow here"))))
 
 (defun apropos-next-symbol ()
-  "Move cursor down to the next symbol in an apropos-mode buffer."
+  "Move cursor down to the next symbol in an `apropos-mode' buffer."
   (interactive)
   (forward-line)
   (while (and (not (eq (face-at-point) 'apropos-symbol))
@@ -1313,7 +1313,7 @@ as a heading."
     (forward-line)))
 
 (defun apropos-previous-symbol ()
-  "Move cursor back to the last symbol in an apropos-mode buffer."
+  "Move cursor back to the last symbol in an `apropos-mode' buffer."
   (interactive)
   (forward-line -1)
   (while (and (not (eq (face-at-point) 'apropos-symbol))
diff --git a/lisp/auth-source.el b/lisp/auth-source.el
index 8d6ebd39dc..3c1a6feaee 100644
--- a/lisp/auth-source.el
+++ b/lisp/auth-source.el
@@ -176,7 +176,7 @@ Overrides `password-cache-expiry' through a let-binding."
 ;; TODO: or maybe leave as (setq auth-source-netrc-use-gpg-tokens 'never)
 
 (defcustom auth-source-netrc-use-gpg-tokens 'never
-  "Set this to tell auth-source when to create GPG password
+  "Set this to tell `auth-source' when to create GPG password
 tokens in netrc files.  It's either an alist or `never'.
 Note that if EPA/EPG is not available, this should NOT be used."
   :version "23.2" ;; No Gnus
@@ -503,7 +503,7 @@ soon as a function returns non-nil.")
 (add-hook 'auth-source-backend-parser-functions 
#'auth-source-backends-parser-secrets)
 
 (defun auth-source-backend-parse-parameters (entry backend)
-  "Fill in the extra auth-source-backend parameters of ENTRY.
+  "Fill in the extra `auth-source-backend' parameters of ENTRY.
 Using the plist ENTRY, get the :host, :port, and :user search
 parameters."
   (let ((entry (if (stringp entry)
@@ -1227,7 +1227,7 @@ FILE is the file from which we obtained this token."
                                     &key backend require create
                                     type max host user port
                                     &allow-other-keys)
-  "Given a property list SPEC, return search matches from the :backend.
+  "Given a property list SPEC, return search matches from the `:backend'.
 See `auth-source-search' for details on SPEC."
   ;; just in case, check that the type is correct (null or same as the backend)
   (cl-assert (or (null type) (eq type (oref backend type)))
@@ -1282,6 +1282,8 @@ See `auth-source-search' for details on SPEC."
          (required (append base-required create-extra))
          (file (oref backend source))
          (add "")
+         ;; Whether to set save-function.
+         save-function
          ;; `valist' is an alist
          valist
          ;; `artificial' will be returned if no creation is needed
@@ -1411,6 +1413,8 @@ See `auth-source-search' for details on SPEC."
         ;; When r is not an empty string...
         (when (and (stringp data)
                    (< 0 (length data)))
+          (when (eq r 'secret)
+            (setq save-function t))
           ;; this function is not strictly necessary but I think it
           ;; makes the code clearer -tzz
           (let ((printer (lambda ()
@@ -1431,12 +1435,13 @@ See `auth-source-search' for details on SPEC."
                                      data)))))
             (setq add (concat add (funcall printer)))))))
 
-    (plist-put
-     artificial
-     :save-function
-     (let ((file file)
-           (add add))
-       (lambda () (auth-source-netrc-saver file add))))
+    (when save-function
+      (plist-put
+       artificial
+       :save-function
+       (let ((file file)
+             (add add))
+         (lambda () (auth-source-netrc-saver file add)))))
 
     (list artificial)))
 
@@ -1664,6 +1669,8 @@ authentication tokens:
                                                 :port port)))
          (required (append base-required create-extra))
          (collection (oref backend source))
+         ;; Whether to set save-function.
+         save-function
          ;; `args' are the arguments for `secrets-create-item'.
          args
          ;; `valist' is an alist
@@ -1778,21 +1785,24 @@ authentication tokens:
 
         ;; When r is not an empty string...
         (when (and (stringp data)
-                   (< 0 (length data))
-                   (not (member r '(secret label))))
-          ;; append the key (the symbol name of r)
-          ;; and the value in r
-          (setq args (append args (list (auth-source--symbol-keyword r) 
data))))))
-
-    (plist-put
-     artificial
-     :save-function
-     (let* ((collection collection)
-            (item (plist-get artificial :label))
-            (secret (plist-get artificial :secret))
-            (secret (if (functionp secret) (funcall secret) secret)))
-       (lambda ()
-        (auth-source-secrets-saver collection item secret args))))
+                   (< 0 (length data)))
+          (if (eq r 'secret)
+              (setq save-function t)
+            (if (not (eq r 'label))
+                ;; append the key (the symbol name of r)
+                ;; and the value in r
+                (setq args (append args (list (auth-source--symbol-keyword r) 
data))))))))
+
+    (when save-function
+      (plist-put
+       artificial
+       :save-function
+       (let* ((collection collection)
+              (item (plist-get artificial :label))
+              (secret (plist-get artificial :secret))
+              (secret (if (functionp secret) (funcall secret) secret)))
+         (lambda ()
+          (auth-source-secrets-saver collection item secret args)))))
 
     (list artificial)))
 
@@ -2264,7 +2274,7 @@ entries for git.gnus.org:
                                     &key backend require
                                     type max host user port
                                     &allow-other-keys)
-  "Given a property list SPEC, return search matches from the :backend.
+  "Given a property list SPEC, return search matches from the `:backend'.
 See `auth-source-search' for details on SPEC."
   ;; just in case, check that the type is correct (null or same as the backend)
   (cl-assert (or (null type) (eq type (oref backend type)))
diff --git a/lisp/autoinsert.el b/lisp/autoinsert.el
index 995d9e2e0f..063d0a14d6 100644
--- a/lisp/autoinsert.el
+++ b/lisp/autoinsert.el
@@ -83,10 +83,11 @@ When this is `function', only ask when called 
non-interactively."
                  (const :tag "Ask if called non-interactively" function)
                  (other :tag "Ask" t)))
 
-(defcustom auto-insert-prompt "Perform %s auto-insertion? "
-  "Prompt to use when querying whether to auto-insert.
+(defcustom auto-insert-prompt "Perform %s auto-insertion?"
+  "Prompt to use when querying whether to `auto-insert'.
 If this contains a %s, that will be replaced by the matching rule."
-  :type 'string)
+  :type 'string
+  :version "28.1")
 
 
 (defcustom auto-insert-alist
diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index c8fe205946..5b1cd32247 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -521,13 +521,12 @@ specifies in the mode line."
         ;; To track non-file buffers, we need to listen in to buffer
         ;; creation in general.  Listening to major-mode changes is
         ;; suitable, since we then know whether it's a mode that is tracked.
-        (when global-auto-revert-non-file-buffers
-          (add-hook 'after-change-major-mode-hook
-                    #'auto-revert--global-adopt-current-buffer))
+        (add-hook 'after-change-major-mode-hook
+                  #'auto-revert--global-possibly-adopt-current-buffer)
         (auto-revert-buffers))
     ;; Turn global-auto-revert-mode OFF.
     (remove-hook 'after-change-major-mode-hook
-                 #'auto-revert--global-adopt-current-buffer)
+                 #'auto-revert--global-possibly-adopt-current-buffer)
     (remove-hook 'find-file-hook #'auto-revert--global-adopt-current-buffer)
     (dolist (buf (buffer-list))
       (with-current-buffer buf
@@ -556,6 +555,12 @@ specifies in the mode line."
                    nil)))
     (setq auto-revert--global-mode t)))
 
+(defun auto-revert--global-possibly-adopt-current-buffer ()
+  "Consider tracking current buffer in a running Global Auto-Revert mode.
+This tracks buffers if `global-auto-revert-non-file-buffers' is non-nil."
+  (when global-auto-revert-non-file-buffers
+    (auto-revert--global-adopt-current-buffer)))
+
 (defun auto-revert--global-adopt-current-buffer ()
   "Consider tracking current buffer in a running Global Auto-Revert mode."
   (auto-revert--global-add-current-buffer)
diff --git a/lisp/bindings.el b/lisp/bindings.el
index 4dfc9a908c..343f1ba0fa 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -184,8 +184,8 @@ mouse-3: Remove current window from display"))
 (defvar mode-line-front-space '(:eval (if (display-graphic-p) " " "-"))
   "Mode line construct to put at the front of the mode line.
 By default, this construct is displayed right at the beginning of
-the mode line, except that if there is a memory-full message, it
-is displayed first.")
+the mode line, except that if there is a \"memory full\" message,
+it is displayed first.")
 (put 'mode-line-front-space 'risky-local-variable t)
 
 (defun mode-line-mule-info-help-echo (window _object _point)
@@ -381,7 +381,8 @@ Keymap to display on major mode.")
 Keymap to display on minor modes.")
 
 (defvar mode-line-modes
-  (let ((recursive-edit-help-echo "Recursive edit, type C-M-c to get out"))
+  (let ((recursive-edit-help-echo
+         "Recursive edit, type M-C-c to get out"))
     (list (propertize "%[" 'help-echo recursive-edit-help-echo)
          "("
          `(:propertize ("" mode-name)
@@ -1085,7 +1086,7 @@ if `inhibit-field-text-motion' is non-nil."
     (define-key map    "p" 'previous-error)
     (define-key map "\M-p" 'previous-error)
     map)
-  "Keymap to repeat next-error key sequences.  Used in `repeat-mode'.")
+  "Keymap to repeat `next-error' key sequences.  Used in `repeat-mode'.")
 (put 'next-error 'repeat-map 'next-error-repeat-map)
 (put 'previous-error 'repeat-map 'next-error-repeat-map)
 
diff --git a/lisp/bookmark.el b/lisp/bookmark.el
index ac63c8f1b0..d64966df5a 100644
--- a/lisp/bookmark.el
+++ b/lisp/bookmark.el
@@ -905,7 +905,9 @@ others are still there, should the user decide to delete 
the most
 recent one.
 
 To yank words from the text of the buffer and use them as part of the
-bookmark name, type C-w while setting a bookmark.  Successive C-w's
+bookmark name, type \\<bookmark-minibuffer-read-name-map>\
+\\[bookmark-yank-word] while setting a bookmark.  Successive \
+\\[bookmark-yank-word]'s
 yank successive words.
 
 Typing \\[universal-argument] inserts (at the bookmark name prompt) the name 
of the last
@@ -938,7 +940,9 @@ Otherwise, if a bookmark named NAME already exists but 
PUSH-BOOKMARK
 is nil, raise an error.
 
 To yank words from the text of the buffer and use them as part of the
-bookmark name, type C-w while setting a bookmark.  Successive C-w's
+bookmark name, type \\<bookmark-minibuffer-read-name-map>\
+\\[bookmark-yank-word] while setting a bookmark.  Successive \
+\\[bookmark-yank-word]'s
 yank successive words.
 
 Typing \\[universal-argument] inserts (at the bookmark name prompt) the name 
of the last
@@ -1361,7 +1365,8 @@ If called from Lisp, prompt for NEW-NAME if only OLD-NAME 
was passed
 as an argument.  If called with two strings, then no prompting is done.
 You must pass at least OLD-NAME when calling from Lisp.
 
-While you are entering the new name, consecutive C-w's insert
+While you are entering the new name, consecutive \
+\\<bookmark-minibuffer-read-name-map>\\[bookmark-yank-word]'s insert
 consecutive words from the text of the buffer into the new bookmark
 name."
   (interactive (list (bookmark-completing-read "Old bookmark name")))
@@ -1734,8 +1739,8 @@ unique numeric suffixes \"<2>\", \"<3>\", etc."
     (define-key map [mouse-2] 'bookmark-bmenu-other-window-with-mouse)
     map))
 
-(easy-menu-define
-  bookmark-menu bookmark-bmenu-mode-map "Bookmark Menu"
+(easy-menu-define bookmark-menu bookmark-bmenu-mode-map
+  "Menu for `bookmark-bmenu'."
   '("Bookmark"
     ["Select Bookmark in This Window" bookmark-bmenu-this-window  t]
     ["Select Bookmark in Full-Frame Window" bookmark-bmenu-1-window  t]
@@ -2062,7 +2067,7 @@ You can mark bookmarks with the 
\\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-mar
 
 (defun bookmark-bmenu-save ()
   "Save the current list into a bookmark file.
-With a prefix arg, prompts for a file to save them in.
+With a prefix arg, prompt for a file to save them in.
 
 See also the related behaviors of `bookmark-load' and
 `bookmark-bmenu-load'."
diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el
index 340c926f8d..1013a7c497 100644
--- a/lisp/buff-menu.el
+++ b/lisp/buff-menu.el
@@ -222,7 +222,7 @@ In Buffer Menu mode, the following commands are defined:
      so the Buffer Menu remains visible in its window.
 \\[Buffer-menu-view]    Select current line's buffer, in View mode.
 \\[Buffer-menu-view-other-window]  Select that buffer in
-     another window, in view-mode.
+     another window, in `view-mode'.
 \\[Buffer-menu-switch-other-window]  Make another window display that buffer.
 \\[Buffer-menu-mark]    Mark current line's buffer to be displayed.
 \\[Buffer-menu-select]    Select current line's buffer.
@@ -233,7 +233,7 @@ In Buffer Menu mode, the following commands are defined:
 \\[Buffer-menu-isearch-buffers]    Incremental search in the marked buffers.
 \\[Buffer-menu-isearch-buffers-regexp]  Isearch for regexp in the marked 
buffers.
 \\[Buffer-menu-multi-occur] Show lines matching regexp in the marked buffers.
-\\[Buffer-menu-visit-tags-table]    visit-tags-table this buffer.
+\\[Buffer-menu-visit-tags-table]    `visit-tags-table' this buffer.
 \\[Buffer-menu-not-modified]    Clear modified-flag on that buffer.
 \\[Buffer-menu-save]    Mark that buffer to be saved, and move down.
 \\[Buffer-menu-delete]  Mark that buffer to be deleted, and move down.
@@ -306,7 +306,7 @@ ARG, show only buffers that are visiting files."
   (display-buffer (list-buffers-noselect arg)))
 
 (defun Buffer-menu-toggle-files-only (arg)
-  "Toggle whether the current buffer-menu displays only file buffers.
+  "Toggle whether the current `buffer-menu' displays only file buffers.
 With a positive ARG, display only file buffers.  With zero or
 negative ARG, display other buffers as well."
   (interactive "P" Buffer-menu-mode)
diff --git a/lisp/button.el b/lisp/button.el
index 74dfb5d541..aedd07b762 100644
--- a/lisp/button.el
+++ b/lisp/button.el
@@ -113,21 +113,22 @@ Mode-specific keymaps may want to use this as their 
parent keymap.")
 
 ;; [this is an internal function]
 (defsubst button-category-symbol (type)
-  "Return the symbol used by button-type TYPE to store properties.
+  "Return the symbol used by `button-type' TYPE to store properties.
 Buttons inherit them by setting their `category' property to that symbol."
   (or (get type 'button-category-symbol)
       (error "Unknown button type `%s'" type)))
 
 (defun define-button-type (name &rest properties)
   "Define a `button type' called NAME (a symbol).
-The remaining arguments form a plist of PROPERTY VALUE pairs,
-specifying properties to use as defaults for buttons with this type
-\(a button's type may be set by giving it a `type' property when
-creating the button, using the :type keyword argument).
+The remaining PROPERTIES arguments form a plist of PROPERTY VALUE
+pairs, specifying properties to use as defaults for buttons with
+this type (a button's type may be set by giving it a `type'
+property when creating the button, using the :type keyword
+argument).
 
 In addition, the keyword argument :supertype may be used to specify a
-button-type from which NAME inherits its default property values
-\(however, the inheritance happens only when NAME is defined; subsequent
+`button-type' from which NAME inherits its default property values
+(however, the inheritance happens only when NAME is defined; subsequent
 changes to a supertype are not reflected in its subtypes)."
   (let ((catsym (make-symbol (concat (symbol-name name) "-button")))
        (super-catsym
@@ -156,15 +157,15 @@ changes to a supertype are not reflected in its 
subtypes)."
     name))
 
 (defun button-type-put (type prop val)
-  "Set the button-type TYPE's PROP property to VAL."
+  "Set the `button-type' TYPE's PROP property to VAL."
   (put (button-category-symbol type) prop val))
 
 (defun button-type-get (type prop)
-  "Get the property of button-type TYPE named PROP."
+  "Get the property of `button-type' TYPE named PROP."
   (get (button-category-symbol type) prop))
 
 (defun button-type-subtype-p (type supertype)
-  "Return non-nil if button-type TYPE is a subtype of SUPERTYPE."
+  "Return non-nil if `button-type' TYPE is a subtype of SUPERTYPE."
   (or (eq type supertype)
       (and type
           (button-type-subtype-p (button-type-get type 'supertype)
@@ -271,11 +272,11 @@ This function only works when BUTTON is in the current 
buffer."
                                    (button-end button))))
 
 (defsubst button-type (button)
-  "Return BUTTON's button-type."
+  "Return BUTTON's `button-type'."
   (button-get button 'type))
 
 (defun button-has-type-p (button type)
-  "Return non-nil if BUTTON has button-type TYPE, or one of its subtypes."
+  "Return non-nil if BUTTON has `button-type' TYPE, or one of its subtypes."
   (button-type-subtype-p (button-get button 'type) type))
 
 (defun button--area-button-p (b)
@@ -290,10 +291,10 @@ Such area buttons are used for buttons in the mode-line 
and header-line."
 
 (defun make-button (beg end &rest properties)
   "Make a button from BEG to END in the current buffer.
-The remaining arguments form a plist of PROPERTY VALUE pairs,
-specifying properties to add to the button.
+The remaining PROPERTIES arguments form a plist of PROPERTY VALUE
+pairs, specifying properties to add to the button.
 In addition, the keyword argument :type may be used to specify a
-button-type from which to inherit other properties; see
+`button-type' from which to inherit other properties; see
 `define-button-type'.
 
 Also see `make-text-button', `insert-button'."
@@ -314,7 +315,7 @@ Also see `make-text-button', `insert-button'."
 The remaining arguments form a plist of PROPERTY VALUE pairs,
 specifying properties to add to the button.
 In addition, the keyword argument :type may be used to specify a
-button-type from which to inherit other properties; see
+`button-type' from which to inherit other properties; see
 `define-button-type'.
 
 Also see `insert-text-button', `make-button'."
@@ -328,10 +329,10 @@ Also see `insert-text-button', `make-button'."
 
 (defun make-text-button (beg end &rest properties)
   "Make a button from BEG to END in the current buffer.
-The remaining arguments form a plist of PROPERTY VALUE pairs,
-specifying properties to add to the button.
+The remaining PROPERTIES arguments form a plist of PROPERTY VALUE
+pairs, specifying properties to add to the button.
 In addition, the keyword argument :type may be used to specify a
-button-type from which to inherit other properties; see
+`button-type' from which to inherit other properties; see
 `define-button-type'.
 
 This function is like `make-button', except that the button is actually
@@ -382,10 +383,10 @@ Also see `insert-text-button'."
 
 (defun insert-text-button (label &rest properties)
   "Insert a button with the label LABEL.
-The remaining arguments form a plist of PROPERTY VALUE pairs,
-specifying properties to add to the button.
+The remaining PROPERTIES arguments form a plist of PROPERTY VALUE
+pairs, specifying properties to add to the button.
 In addition, the keyword argument :type may be used to specify a
-button-type from which to inherit other properties; see
+`button-type' from which to inherit other properties; see
 `define-button-type'.
 
 This function is like `insert-button', except that the button is
diff --git a/lisp/calc/calc-aent.el b/lisp/calc/calc-aent.el
index 0e913ddfdb..52c024865a 100644
--- a/lisp/calc/calc-aent.el
+++ b/lisp/calc/calc-aent.el
@@ -537,8 +537,7 @@ The value t means abort and give an error message.")
     ("₋"  "-")  ; -
     ("₍"  "(")  ; (
     ("₎"  ")"))  ; )
-  "A list whose elements (old new) indicate replacements to make
-in Calc algebraic input.")
+  "A list indicating replacements to make in Calc algebraic input.")
 
 (defvar math-read-superscripts
   "⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁽⁾ⁿⁱ" ; 0123456789+-()ni
diff --git a/lisp/calc/calc-forms.el b/lisp/calc/calc-forms.el
index ac57011da0..ce8e3579f4 100644
--- a/lisp/calc/calc-forms.el
+++ b/lisp/calc/calc-forms.el
@@ -703,16 +703,19 @@ in the Gregorian calendar."
          fmt))))
 
 (defconst math-julian-date-beginning '(float 17214245 -1)
-  "The beginning of the Julian date calendar,
-as measured in the number of days before December 31, 1 BC (Gregorian).")
+  "The beginning of the Julian date calendar.
+This is measured in the number of days before December 31, 1
+BC (Gregorian).")
 
 (defconst math-julian-date-beginning-int 1721425
-  "The beginning of the Julian date calendar,
-as measured in the integer number of days before December 31, 1 BC 
(Gregorian).")
+  "The beginning of the Julian date calendar.
+This is measured in the integer number of days before December
+31, 1 BC (Gregorian).")
 
 (defconst math-unix-epoch 719163
-  "The beginning of Unix time: days from December 31, 1 BC (Gregorian)
-to Jan 1, 1970 AD.")
+  "The beginning of Unix time.
+This is measured in the integer number of days from December 31,
+1 BC (Gregorian) to Jan 1, 1970 AD.")
 
 (defun math-format-date-part (x)
   (cond ((stringp x)
diff --git a/lisp/calc/calc-poly.el b/lisp/calc/calc-poly.el
index 77587cc4b8..5d74a8f106 100644
--- a/lisp/calc/calc-poly.el
+++ b/lisp/calc/calc-poly.el
@@ -454,7 +454,7 @@ This returns only the remainder from the pseudo-division."
 
 
 (defun math-atomic-factorp (expr)
-  "Return true if is a factor containing no sums or quotients."
+  "Return non-nil if is a factor containing no sums or quotients."
   (cond ((eq (car-safe expr) '*)
         (and (math-atomic-factorp (nth 1 expr))
              (math-atomic-factorp (nth 2 expr))))
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el
index afb43c0f33..45a4d56a37 100644
--- a/lisp/calc/calc.el
+++ b/lisp/calc/calc.el
@@ -400,8 +400,7 @@ This is not required to be present for user-written mode 
annotations."
   :type 'boolean)
 
 (defcustom calc-ensure-consistent-units nil
-  "If non-nil, make sure new units are consistent with current units
-when converting units."
+  "If non-nil, ensure new units are consistent with current units when 
converting."
   :version "24.3"
   :type 'boolean)
 
@@ -468,11 +467,11 @@ This is 1 unless `calc-truncate-stack' has been used.")
 
 (defvar calc-display-sci-high 0
   "Floating-point numbers with this positive exponent or higher above the
-current precision are displayed in scientific notation in calc-mode.")
+current precision are displayed in scientific notation in `calc-mode'.")
 
 (defvar calc-display-sci-low -3
   "Floating-point numbers with this negative exponent or lower are displayed
-scientific notation in calc-mode.")
+scientific notation in `calc-mode'.")
 
 (defvar calc-digit-after-point nil
   "If t, display at least one digit after the decimal point, as in `12.0'.
@@ -493,8 +492,7 @@ This setting only applies to floats in normal display 
mode.")
   "List of variables used in customizing GNU Calc.")
 
 (defmacro defcalcmodevar (var defval &optional doc)
-  "Declare VAR as a Calc variable, with default value DEFVAL
-and doc-string DOC.
+  "Declare VAR as a Calc variable, with default value DEFVAL and doc-string 
DOC.
 The variable VAR will be added to `calc-mode-var-list'."
   `(progn
      (defvar ,var ,defval ,doc)
@@ -912,7 +910,7 @@ Used by `calc-user-invocation'.")
 (defvar calc-trail-pointer nil
   "The \"current\" entry in trail buffer.")
 (defvar calc-trail-overlay nil
-  "The value of overlay-arrow-string.")
+  "The value of `overlay-arrow-string'.")
 (defvar calc-undo-list nil
   "The list of previous operations for undo.")
 (defvar calc-redo-list nil
diff --git a/lisp/calc/calcalg3.el b/lisp/calc/calcalg3.el
index 3cb1886f3b..a61cdb5d0e 100644
--- a/lisp/calc/calcalg3.el
+++ b/lisp/calc/calcalg3.el
@@ -1484,7 +1484,7 @@
                      h (cdr h)))
            (setq curh (math-div-float curh '(float 9 0))))
          ss
-         (math-reject-arg nil (format "*Integral failed to converge"))))))
+         (math-reject-arg nil "*Integral failed to converge")))))
 
 
 (defun math-ninteg-evaluate (expr x mode)
diff --git a/lisp/calculator.el b/lisp/calculator.el
index 415e0b4c77..6bcea2d885 100644
--- a/lisp/calculator.el
+++ b/lisp/calculator.el
@@ -833,8 +833,7 @@ The result should not exceed the screen width."
     (concat prompt (if (<= trim 0) expr (substring expr trim)))))
 
 (defun calculator-string-to-number (str)
-  "Convert the given STR to a number, according to the value of
-`calculator-input-radix'."
+  "Convert STR to number according to `calculator-input-radix'."
   (if calculator-input-radix
     (string-to-number str (cadr (assq calculator-input-radix
                                       '((bin 2) (oct 8) (hex 16)))))
@@ -1171,9 +1170,9 @@ arguments."
 ;;; Input interaction
 
 (defun calculator-last-input (&optional keys)
-  "Return the last key sequence that was used to invoke this command, or
-the input KEYS.  Uses the `function-key-map' translate keypad numbers to
-plain ones."
+  "Return the last key sequence used to invoke this command, or the input KEYS.
+Uses the `function-key-map' translate keypad numbers to plain
+ones."
   (let* ((inp (or keys (this-command-keys)))
          (inp (or (and (arrayp inp) (not (stringp inp))
                        (lookup-key function-key-map inp))
diff --git a/lisp/calendar/cal-tex.el b/lisp/calendar/cal-tex.el
index 75e106cb37..c5b456c4c2 100644
--- a/lisp/calendar/cal-tex.el
+++ b/lisp/calendar/cal-tex.el
@@ -1648,10 +1648,10 @@ informative header, and run HOOK."
   (goto-char (point-min))
   ;; FIXME auctex equivalents?
   (cal-tex-comment
-   (format "\tThis buffer was produced by cal-tex.el.
+   "\tThis buffer was produced by cal-tex.el.
 \tTo print a calendar, type
 \t\tM-x tex-buffer RET
-\t\tM-x tex-print  RET")))
+\t\tM-x tex-print  RET"))
 
 (defun cal-tex-insert-preamble (weeks &optional class-options append)
   "Initialize the output LaTeX calendar buffer, `cal-tex-buffer'.
diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index 9ca7ce3f00..2eb7977a16 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -1223,8 +1223,7 @@ ensure that all relevant variables are set.
 
 \(diary-mail-entries)
 
-# diary-rem.el ends here
-"
+# diary-rem.el ends here"
   (interactive "P")
   (if (string-equal diary-mail-addr "")
       (user-error "You must set `diary-mail-addr' to use this command")
@@ -1254,10 +1253,10 @@ the regexp with parentheses."
               paren))
 
 (defvar diary-marking-entries-flag nil
-  "True during the marking of diary entries, nil otherwise.")
+  "Non-nil during the marking of diary entries, nil otherwise.")
 
 (defvar diary-marking-entry-flag nil
-  "True during the marking of diary entries, if current entry is marking.")
+  "Non-nil during the marking of diary entries, if current entry is marking.")
 
 ;; file-glob-attrs bound in diary-mark-entries.
 (defun diary-mark-entries-1 (markfunc &optional months symbol absfunc)
diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el
index 312d5e2f38..2d31101e50 100644
--- a/lisp/calendar/icalendar.el
+++ b/lisp/calendar/icalendar.el
@@ -2182,8 +2182,7 @@ written into the buffer `*icalendar-errors*'."
               (setq diary-string "")
               (mapc (lambda (_datestring)
                      (setq diary-string
-                           (concat diary-string
-                                   (format "......"))))
+                           (concat diary-string "......")))
                    (icalendar--split-value rdate)))
              ;; non-recurring event
              ;; all-day event
@@ -2528,7 +2527,7 @@ the entry."
                                       summary)))
     (when summary
       (setq non-marking
-            (y-or-n-p (format "Make appointment non-marking? "))))
+            (y-or-n-p "Make appointment non-marking? ")))
     (unless diary-filename
       (setq diary-filename
             (read-file-name "Add appointment to this diary file: ")))
diff --git a/lisp/cedet/pulse.el b/lisp/cedet/pulse.el
index 7928fa1bf4..b026944029 100644
--- a/lisp/cedet/pulse.el
+++ b/lisp/cedet/pulse.el
@@ -195,11 +195,13 @@ Optional argument FACE specifies the face to do the 
highlighting."
   (remove-hook 'pre-command-hook #'pulse-momentary-unhighlight))
 
 ;;;###autoload
-(defun pulse-momentary-highlight-one-line (point &optional face)
+(defun pulse-momentary-highlight-one-line (&optional point face)
   "Highlight the line around POINT, unhighlighting before next command.
+If POINT is nil or missing, the current point is used instead.
+
 Optional argument FACE specifies the face to do the highlighting."
   (save-excursion
-    (goto-char point)
+    (goto-char (or point (point)))
     (let ((start (point-at-bol))
           (end (save-excursion
                  (end-of-line)
diff --git a/lisp/cedet/semantic/symref/grep.el 
b/lisp/cedet/semantic/symref/grep.el
index 53745b429a..077a2d4861 100644
--- a/lisp/cedet/semantic/symref/grep.el
+++ b/lisp/cedet/semantic/symref/grep.el
@@ -133,6 +133,12 @@ This shell should support pipe redirect syntax."
   :group 'semantic
   :type 'string)
 
+(defun semantic-symref-grep--quote-grep (string)
+  "Quote STRING as a grep-syntax regexp."
+  (replace-regexp-in-string (rx (in ".^$*[\\"))
+                            (lambda (s) (concat "\\" s))
+                            string nil t))
+
 (cl-defmethod semantic-symref-perform-search ((tool semantic-symref-tool-grep))
   "Perform a search with Grep."
   ;; Grep doesn't support some types of searches.
@@ -151,7 +157,10 @@ This shell should support pipe redirect syntax."
                           ((eq (oref tool searchtype) 'regexp)
                            "-nE ")
                           (t "-nw ")))
-         (greppat (oref tool searchfor))
+         (searchfor (oref tool searchfor))
+         (greppat (if (eq (oref tool searchtype) 'regexp)
+                      searchfor
+                    (semantic-symref-grep--quote-grep searchfor)))
         ;; Misc
         (b (get-buffer-create "*Semantic SymRef*"))
         (ans nil)
diff --git a/lisp/char-fold.el b/lisp/char-fold.el
index 46a3f93d0a..e3ab7d5b64 100644
--- a/lisp/char-fold.el
+++ b/lisp/char-fold.el
@@ -20,6 +20,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (eval-and-compile
diff --git a/lisp/cmuscheme.el b/lisp/cmuscheme.el
index 0910ea6187..e197069d6b 100644
--- a/lisp/cmuscheme.el
+++ b/lisp/cmuscheme.el
@@ -186,7 +186,7 @@ Return before the end of the process' output copies the 
sexp ending at point
 Delete converts tabs to spaces as it moves back.
 Tab indents for Scheme; with argument, shifts rest
     of expression rigidly with the current line.
-C-M-q does Tab on each line starting within following expression.
+\\[indent-pp-sexp] does Tab on each line starting within following expression.
 Paragraphs are separated only by blank lines.  Semicolons start comments.
 If you accidentally suspend your process, use \\[comint-continue-subjob]
 to continue it."
diff --git a/lisp/comint.el b/lisp/comint.el
index 56d4420e60..8bf23897f9 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -2830,7 +2830,7 @@ if necessary."
     (when (>= count 0) (comint-update-fence))))
 
 (defun comint-kill-region (beg end)
-  "Like `kill-region', but ignores read-only properties, if safe.
+  "Like `kill-region', but ignore read-only properties, if safe.
 This command assumes that the buffer contains read-only
 \"prompts\" which are regions with front-sticky read-only
 properties at the beginning of a line, with the preceding newline
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 7eae2e416b..69baf17f5e 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -5123,8 +5123,8 @@ If several parents are listed, go to the first of them."
 The following commands are available:
 
 \\<widget-keymap>\
-Move to next button, link or editable field.     \\[widget-forward]
-Move to previous button, link or editable field. \\[widget-backward]
+Move to next button, link or editable field.      \\[widget-forward]
+Move to previous button, link or editable field.  \\[widget-backward]
 \\<custom-field-keymap>\
 Complete content of editable text field.   \\[widget-complete]
 \\<custom-mode-map>\
diff --git a/lisp/cus-theme.el b/lisp/cus-theme.el
index 7457d9e323..07881e9b74 100644
--- a/lisp/cus-theme.el
+++ b/lisp/cus-theme.el
@@ -22,6 +22,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'widget)
diff --git a/lisp/dabbrev.el b/lisp/dabbrev.el
index e113cc94c3..037787797b 100644
--- a/lisp/dabbrev.el
+++ b/lisp/dabbrev.el
@@ -568,8 +568,7 @@ See also `dabbrev-abbrev-char-regexp' and 
\\[dabbrev-completion]."
        major-mode)))
 
 (defun dabbrev--goto-start-of-abbrev ()
-  "Back over all abbrev type characters and then moves forward over
-all skip characters."
+  "Back over all abbrev type characters then move forward over all skip 
characters."
   ;; Move backwards over abbrev chars
   (save-match-data
     (when (> (point) (minibuffer-prompt-end))
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 53fbcfb6d0..1bb5b92935 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -1245,7 +1245,7 @@ and `dired-compress-files-alist'."
                                   (?i . ,(mapconcat
                                           (lambda (in-file)
                                             (shell-quote-argument
-                                             (file-name-nondirectory in-file)))
+                                             (file-relative-name in-file)))
                                           in-files " "))))))
              (message (ngettext "Compressed %d file to %s"
                                "Compressed %d files to %s"
@@ -1326,7 +1326,7 @@ Return nil if no change in files."
                        (user-error
                         "No compression rule found for \
 `dired-compress-directory-default-suffix' %s, see `dired-compress-files-alist' 
for\
- the supported suffixes list."
+ the supported suffixes list"
                         dired-compress-directory-default-suffix)))
                  (let* ((suffix (or dired-compress-file-default-suffix ".gz"))
                         (out-name (concat file suffix))
@@ -1335,7 +1335,7 @@ Return nil if no change in files."
                                dired-compress-file-alist)))
                    (if (not rule)
                        (user-error "No compression rule found for suffix %s, \
-see `dired-compress-file-alist' for the supported suffixes list."
+see `dired-compress-file-alist' for the supported suffixes list"
                                    dired-compress-file-default-suffix)
                      (and (file-exists-p file)
                           (or (not (file-exists-p out-name))
diff --git a/lisp/dired-x.el b/lisp/dired-x.el
index 9f9f170173..cf257c8169 100644
--- a/lisp/dired-x.el
+++ b/lisp/dired-x.el
@@ -589,7 +589,7 @@ This is useful if you want to peruse and move around in an 
ls -lR
 output file, for example one you got from an ftp server.  With
 ange-ftp, you can even Dired a directory containing an ls-lR file,
 visit that file and turn on Virtual Dired mode.  But don't try to save
-this file, as dired-virtual indents the listing and thus changes the
+this file, as `dired-virtual' indents the listing and thus changes the
 buffer.
 
 If you have saved a Dired buffer in a file you can use \\[dired-virtual] to
@@ -956,7 +956,7 @@ as the variable `file'.
 
 If several COMMANDs are given, the first one will be the default
 and the rest will be added temporarily to the history and can be retrieved
-with \\[previous-history-element] (M-p) .
+with `previous-history-element' 
(\\<minibuffer-mode-map>\\[previous-history-element]).
 
 The variable `dired-guess-shell-case-fold-search' controls whether
 REGEXP is matched case-sensitively."
diff --git a/lisp/dired.el b/lisp/dired.el
index 266a03e6cc..07c13e18b9 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -2219,8 +2219,7 @@ Do so according to the former subdir alist 
OLD-SUBDIR-ALIST."
 ;; Autoload cookie needed by desktop.el
 ;;;###autoload
 (defun dired-mode (&optional dirname switches)
-  "\
-Mode for \"editing\" directory listings.
+  "Mode for \"editing\" directory listings.
 In Dired, you are \"editing\" a list of the files in a directory and
   (optionally) its subdirectories, in the format of `ls -lR'.
   Each directory is a page: use \\[backward-page] and \\[forward-page] to move 
pagewise.
@@ -3697,7 +3696,7 @@ no ARGth marked file is found before this line."
 (defun dired-mark-files-in-region (start end)
   (let ((inhibit-read-only t))
     (if (> start end)
-       (error "start > end"))
+        (error "Start > End"))
     (goto-char start)                  ; assumed at beginning of line
     (while (< (point) end)
       ;; Skip subdir line and following garbage like the `total' line:
diff --git a/lisp/display-fill-column-indicator.el 
b/lisp/display-fill-column-indicator.el
index 50252af453..7e9d62c5d1 100644
--- a/lisp/display-fill-column-indicator.el
+++ b/lisp/display-fill-column-indicator.el
@@ -45,7 +45,7 @@
 
 ;;;###autoload
 (define-minor-mode display-fill-column-indicator-mode
-  "Toggle display of fill-column indicator.
+  "Toggle display of `fill-column' indicator.
 This uses `display-fill-column-indicator' internally.
 
 To change the position of the column displayed by default
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index 0896bd13eb..088ca5bfea 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -727,7 +727,7 @@ It's a subdirectory of `doc-view-cache-directory'."
          (file-name-as-directory
           (expand-file-name
            (concat (thread-last
-                        (file-name-nondirectory doc-view--buffer-file-name)
+                      (file-name-nondirectory doc-view--buffer-file-name)
                       ;; bug#13679
                       (subst-char-in-string ?% ?_)
                       ;; arc-mode concatenates archive name and file name
diff --git a/lisp/dos-vars.el b/lisp/dos-vars.el
index 2f7b3760e3..7fcbb56d22 100644
--- a/lisp/dos-vars.el
+++ b/lisp/dos-vars.el
@@ -34,9 +34,9 @@
   :type '(repeat string))
 
 (defcustom dos-codepage-setup-hook nil
-  "List of functions to be called after the DOS terminal and coding
-systems are set up.  This is the place, e.g., to set specific entries
-in `standard-display-table' as appropriate for your codepage, if
+  "List of functions to call after setting up DOS terminal and coding systems.
+This is the place, e.g., to set specific entries in
+`standard-display-table' as appropriate for your codepage, if
 `IT-display-table-setup' doesn't do a perfect job."
   :type '(hook)
   :version "20.3.3")
diff --git a/lisp/edmacro.el b/lisp/edmacro.el
index 8ee413acd0..e90b3a006e 100644
--- a/lisp/edmacro.el
+++ b/lisp/edmacro.el
@@ -108,7 +108,7 @@ With a prefix argument, format the macro in a more concise 
way."
                  (memq cmd-noremap '(call-last-kbd-macro kmacro-call-macro 
kmacro-end-or-call-macro kmacro-end-and-call-macro))
                 (member keys '("\r" [return])))
             (or last-kbd-macro
-                (y-or-n-p "No keyboard macro defined.  Create one? ")
+                 (y-or-n-p "No keyboard macro defined.  Create one?")
                 (keyboard-quit))
             (setq mac (or last-kbd-macro ""))
             (setq keys nil)
@@ -244,8 +244,9 @@ or nil, use a compact 80-column format."
                        (and (fboundp cmd) (not (arrayp (symbol-function cmd)))
                             (not (get cmd 'kmacro))
                             (not (y-or-n-p
-                                  (format "Command %s is already defined; %s"
-                                          cmd "proceed? ")))
+                                   (format
+                                    "Command %s is already defined; proceed?"
+                                    cmd)))
                             (keyboard-quit))))
                    t)
                   ((looking-at "Key:\\(.*\\)$")
@@ -264,9 +265,9 @@ or nil, use a compact 80-column format."
                                     (not (or (arrayp (symbol-function b))
                                              (get b 'kmacro))))
                                 (not (y-or-n-p
-                                      (format "Key %s is already defined; %s"
-                                              (edmacro-format-keys key 1)
-                                              "proceed? ")))
+                                       (format
+                                        "Key %s is already defined; proceed?"
+                                        (edmacro-format-keys key 1))))
                                 (keyboard-quit))))))
                    t)
                   ((looking-at "Counter:[ \t]*\\([^ \t\n]*\\)[ \t]*$")
diff --git a/lisp/elec-pair.el b/lisp/elec-pair.el
index 82db8dbfc7..ba88c81913 100644
--- a/lisp/elec-pair.el
+++ b/lisp/elec-pair.el
@@ -63,7 +63,7 @@ When inserting a closing paren character right before the 
same character,
 just skip that character instead, so that hitting ( followed by ) results
 in \"()\" rather than \"())\".
 
-This can be convenient for people who find it easier to hit ) than C-f.
+This can be convenient for people who find it easier to hit ) than 
\\[forward-char].
 
 Can also be a function of one argument (the closer char just
 inserted), in which case that function's return value is
@@ -485,6 +485,27 @@ happened."
     (electric-pair-conservative-inhibit char)))
 
 (defun electric-pair-post-self-insert-function ()
+  "Member of `post-self-insert-hook'.  Do main work for `electric-pair-mode'.
+If the newly inserted character C has delimiter syntax, this
+function may decide to insert additional paired delimiters, or
+skip the insertion of the new character altogether by jumping
+over an existing identical character, or do nothing.
+
+The decision is taken by order of preference:
+
+* According to `use-region-p'.  If this returns non-nil this
+  function will unconditionally \"wrap\" the region in the
+  corresponding delimiter for C;
+
+* According to C alone, by looking C up in the tables
+  `electric-pair-paris' or `electric-pair-text-pairs' (which
+  see);
+
+* According to C's syntax and the syntactic state of the buffer
+  (both as defined by the major mode's syntax table).  This is
+  done by looking up up the variables
+  `electric-pair-inhibit-predicate', `electric-pair-skip-self'
+  and `electric-pair-skip-whitespace' (which see)."
   (let* ((pos (and electric-pair-mode (electric--after-char-pos)))
          (skip-whitespace-info))
     (pcase (electric-pair-syntax-info last-command-event)
@@ -551,18 +572,21 @@ happened."
                          (goto-char pos)
                          (funcall electric-pair-inhibit-predicate
                                   last-command-event)))))
-         (save-excursion (electric-pair--insert pair)))))
-      (_
-       (when (and (if (functionp electric-pair-open-newline-between-pairs)
-                      (funcall electric-pair-open-newline-between-pairs)
-                    electric-pair-open-newline-between-pairs)
-                  (eq last-command-event ?\n)
-                  (< (1+ (point-min)) (point) (point-max))
-                  (eq (save-excursion
-                        (skip-chars-backward "\t\s")
-                        (char-before (1- (point))))
-                      (matching-paren (char-after))))
-         (save-excursion (newline 1 t)))))))
+         (save-excursion (electric-pair--insert pair))))))))
+
+(defun electric-pair-open-newline-between-pairs-psif ()
+  "Honour `electric-pair-open-newline-between-pairs'.
+Member of `post-self-insert-hook' if `electric-pair-mode' is on."
+  (when (and (if (functionp electric-pair-open-newline-between-pairs)
+                 (funcall electric-pair-open-newline-between-pairs)
+               electric-pair-open-newline-between-pairs)
+             (eq last-command-event ?\n)
+             (< (1+ (point-min)) (point) (point-max))
+             (eq (save-excursion
+                   (skip-chars-backward "\t\s")
+                   (char-before (1- (point))))
+                 (matching-paren (char-after))))
+    (save-excursion (newline 1 t))))
 
 (defun electric-pair-will-use-region ()
   (and (use-region-p)
@@ -623,10 +647,15 @@ To toggle the mode in a single buffer, use 
`electric-pair-local-mode'."
                   ;; `electric-indent-mode' are used together.
                   ;; Use `vc-region-history' on these lines for more info.
                   50)
+        (add-hook 'post-self-insert-hook
+                 #'electric-pair-open-newline-between-pairs-psif
+                  50)
        (add-hook 'self-insert-uses-region-functions
                  #'electric-pair-will-use-region))
     (remove-hook 'post-self-insert-hook
                  #'electric-pair-post-self-insert-function)
+    (remove-hook 'post-self-insert-hook
+                 #'electric-pair-open-newline-between-pairs-psif)
     (remove-hook 'self-insert-uses-region-functions
                  #'electric-pair-will-use-region)))
 
diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el
index 1f276c7f7a..15e413e0e8 100644
--- a/lisp/emacs-lisp/advice.el
+++ b/lisp/emacs-lisp/advice.el
@@ -1033,7 +1033,7 @@
 ;;
 ;; To make sure a certain piece of advice gets executed even if some error or
 ;; non-local exit occurred in any preceding code, we can protect it by using
-;; the `protect' keyword. (if any of the around advices is protected then the
+;; the `protect' keyword (if any of the around advices is protected then the
 ;; whole around advice onion will be protected):
 ;;
 ;; (defadvice foo (after fg-cleanup prot act)
@@ -3105,7 +3105,7 @@ The syntax of `defadvice' is as follows:
 FUNCTION ::= Name of the function to be advised.
 CLASS ::= `before' | `around' | `after' | `activation' | `deactivation'.
 NAME ::= Non-nil symbol that names this piece of advice.
-POSITION ::= `first' | `last' | NUMBER. Optional, defaults to `first',
+POSITION ::= `first' | `last' | NUMBER.  Optional, defaults to `first',
     see also `ad-add-advice'.
 ARGLIST ::= An optional argument list to be used for the advised function
     instead of the argument list of the original.  The first one found in
diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el
index e9a20634af..f620cdbb33 100644
--- a/lisp/emacs-lisp/autoload.el
+++ b/lisp/emacs-lisp/autoload.el
@@ -25,7 +25,7 @@
 
 ;; This code helps GNU Emacs maintainers keep the loaddefs.el file up to
 ;; date.  It interprets magic cookies of the form ";;;###autoload" in
-;; lisp source files in various useful ways.  To learn more, read the
+;; Lisp source files in various useful ways.  To learn more, read the
 ;; source; if you're going to use this, you'd better be able to.
 
 ;;; Code:
@@ -432,8 +432,10 @@ FILE's name."
   file)
 
 (defun autoload-insert-section-header (outbuf autoloads load-name file time)
-  "Insert the section-header line,
-which lists the file name and which functions are in it, etc."
+  "Insert into buffer OUTBUF the section-header line for FILE.
+The header line lists the file name, its \"load name\", its autoloads,
+and the time the FILE was last updated (the time is inserted only
+if `autoload-timestamps' is non-nil, otherwise a fixed fake time is inserted)."
   ;; (cl-assert ;Make sure we don't insert it in the middle of another section.
   ;;  (save-excursion
   ;;    (or (not (re-search-backward
diff --git a/lisp/emacs-lisp/backtrace.el b/lisp/emacs-lisp/backtrace.el
index ea70baa953..a5721aa319 100644
--- a/lisp/emacs-lisp/backtrace.el
+++ b/lisp/emacs-lisp/backtrace.el
@@ -868,7 +868,7 @@ commands.
 \\{backtrace-mode-map}
 
 A mode which inherits from Backtrace mode, or a command which
-creates a backtrace-mode buffer, should usually do the following:
+creates a `backtrace-mode' buffer, should usually do the following:
 
  - Set `backtrace-revert-hook', if the buffer contents need
    to be specially recomputed prior to `revert-buffer'.
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 966ef266b9..c15814afa0 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -202,7 +202,7 @@
                          (intern (substring (symbol-name arg) 5))
                        arg)
                    (if (integerp (setq c (car arg)))
-                       (error "non-symbolic byte-op %s" c))
+                        (error "Non-symbolic byte-op %s" c))
                    (if (eq c 'TAG)
                        (setq c arg)
                      (setq a (cond ((memq c byte-goto-ops)
@@ -1753,7 +1753,7 @@ See Info node `(elisp) Integer Basics'."
               (setq tags (delq tmp tags))
               (setq rest (cdr rest))))
        (setq rest (cdr rest))))
-    (if tags (error "optimizer error: missed tags %s" tags))
+    (if tags (error "Optimizer error: missed tags %s" tags))
     ;; Remove addrs, lap = ( [ (op . arg) | (TAG tagno) ]* )
     (mapcar (lambda (elt)
               (if (numberp elt)
diff --git a/lisp/emacs-lisp/byte-run.el b/lisp/emacs-lisp/byte-run.el
index 6d698ffb6f..35c80e524c 100644
--- a/lisp/emacs-lisp/byte-run.el
+++ b/lisp/emacs-lisp/byte-run.el
@@ -529,11 +529,11 @@ is enabled."
   (list 'quote (eval (cons 'progn body) lexical-binding)))
 
 (defmacro eval-and-compile (&rest body)
-  "Like `progn', but evaluates the body at compile time and at
-load time.  In interpreted code, this is entirely equivalent to
-`progn', except that the value of the expression may be (but is
-not necessarily) computed at load time if eager macro expansion
-is enabled."
+  "Like `progn', but evaluates the body at compile time and at load time.
+In interpreted code, this is entirely equivalent to `progn',
+except that the value of the expression may be (but is not
+necessarily) computed at load time if eager macro expansion is
+enabled."
   (declare (debug (&rest def-form)) (indent 0))
   ;; When the byte-compiler expands code, this macro is not used, so we're
   ;; either about to run `body' (plain interpretation) or we're doing eager
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 776e84dfeb..be74195778 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -551,7 +551,7 @@ has the form (autoload . FILENAME).")
   "Alist of undefined functions to which calls have been compiled.
 Each element in the list has the form (FUNCTION POSITION . CALLS)
 where CALLS is a list whose elements are integers (indicating the
-number of arguments passed in the function call) or the constant `t'
+number of arguments passed in the function call) or the constant t
 if the function is called indirectly.
 This variable is only significant whilst compiling an entire buffer.
 Used for warnings when a function is not known to be defined or is later
@@ -915,7 +915,7 @@ CONST2 may be evaluated multiple times."
                                ,bytes ,pc))
 
 (defun byte-compile-lapcode (lap)
-  "Turns lapcode into bytecode.  The lapcode is destroyed."
+  "Turn lapcode LAP into bytecode.  The lapcode is destroyed."
   ;; Lapcode modifications: changes the ID of a tag to be the tag's PC.
   (let ((pc 0)                 ; Program counter
        op off                  ; Operation & offset
@@ -1899,7 +1899,7 @@ also be compiled."
   "Non-nil to prevent byte-compiling of Emacs Lisp code.
 This is normally set in local file variables at the end of the elisp file:
 
-\;; Local Variables:\n;; no-byte-compile: t\n;; End: ") ;Backslash for 
compile-main.
+\;; Local Variables:\n;; no-byte-compile: t\n;; End:") ;Backslash for 
compile-main.
 ;;;###autoload(put 'no-byte-compile 'safe-local-variable 'booleanp)
 
 (defun byte-recompile-file (filename &optional force arg load)
@@ -4417,7 +4417,7 @@ Return (TAIL VAR TEST CASES), where:
          (cases (nth 2 switch))
          jump-table test-objects body tag default-tag)
     ;; TODO: Once :linear-search is implemented for `make-hash-table'
-    ;; set it to `t' for cond forms with a small number of cases.
+    ;; set it to t for cond forms with a small number of cases.
     (let ((nvalues (apply #'+ (mapcar (lambda (case) (length (car case)))
                                       cases))))
       (setq jump-table (make-hash-table
@@ -4446,7 +4446,7 @@ Return (TAIL VAR TEST CASES), where:
     (byte-compile-out 'byte-switch)
 
     ;; When the opcode argument is `byte-goto', `byte-compile-goto' sets
-    ;; `byte-compile-depth' to `nil'. However, we need `byte-compile-depth'
+    ;; `byte-compile-depth' to nil. However, we need `byte-compile-depth'
     ;; to be non-nil for generating tags for all cases. Since
     ;; `byte-compile-depth' will increase by at most 1 after compiling
     ;; all of the clause (which is further enforced by cl-assert below)
diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el
index ba29e4ec85..0a6b04b4c1 100644
--- a/lisp/emacs-lisp/cconv.el
+++ b/lisp/emacs-lisp/cconv.el
@@ -794,6 +794,8 @@ This function does not return anything but instead fills the
     ;; (`(declare . ,_) nil)               ;The args don't contain code.
 
     (`(,_ . ,body-forms)    ; First element is a function or whatever.
+     (unless (listp body-forms)
+       (signal 'wrong-type-argument (list 'proper-list-p form)))
      (dolist (form body-forms) (cconv-analyze-form form env)))
 
     ((pred symbolp)
diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el
index 01f2c0d95f..5224a943ac 100644
--- a/lisp/emacs-lisp/checkdoc.el
+++ b/lisp/emacs-lisp/checkdoc.el
@@ -29,11 +29,12 @@
 ;; to forget.  The main checkdoc engine will perform the stylistic
 ;; checks needed to make sure these styles are remembered.
 ;;
-;; There are two ways to use checkdoc:
-;;   1) Periodically use `checkdoc' or `checkdoc-current-buffer'.
+;; There are three ways to use checkdoc:
+;;   1) Use `flymake-mode'.
+;;   2) Periodically use `checkdoc' or `checkdoc-current-buffer'.
 ;;      `checkdoc' is a more interactive version of
 ;;      `checkdoc-current-buffer'
-;;   2) Use `checkdoc-minor-mode' to automatically check your
+;;   3) Use `checkdoc-minor-mode' to automatically check your
 ;;      documentation whenever you evaluate Lisp code with C-M-x
 ;;      or [menu-bar emacs-lisp eval-buffer].  Additional key-bindings
 ;;      are also provided under C-c ? KEY
@@ -117,8 +118,7 @@
 ;;   The text that follows the `error' and `y-or-n-p' commands is
 ;; also checked.  The documentation for `error' clearly states some
 ;; simple style rules to follow which checkdoc will auto-fix for you.
-;; `y-or-n-p' also states that it should end in a space.  I added that
-;; it should end in "? " since that is almost always used.
+;; `y-or-n-p' and `yes-or-no-p' should also end in "?".
 ;;
 ;; Adding your own checks:
 ;;
@@ -164,6 +164,7 @@
 (require 'cl-lib)
 (require 'help-mode) ;; for help-xref-info-regexp
 (require 'thingatpt) ;; for handy thing-at-point-looking-at
+(require 'dired)     ;; for dired-get-filename and dired-map-over-marks
 (require 'lisp-mnt)
 
 (defvar compilation-error-regexp-alist)
@@ -312,9 +313,10 @@ Do not set this by hand, use a function like 
`checkdoc-current-buffer'
 with a universal argument.")
 
 (defcustom checkdoc-symbol-words
-  '("beginning-of-line" "byte-code" "command-line" "end-of-line"
-    "major-mode" "syntax-table" "top-level" "user-error"
-    "version-control" "window-system")
+  '("beginning-of-buffer" "beginning-of-line" "byte-code"
+    "byte-compile" "command-line" "end-of-buffer" "end-of-line"
+    "major-mode" "point-max" "point-min" "syntax-table"
+    "top-level" "user-error" "version-control" "window-system")
   "A list of symbol names (strings) which also happen to make good words.
 These words are ignored when unquoted symbols are searched for.
 This should be set in an Emacs Lisp file's local variables."
@@ -330,6 +332,35 @@ See Info node `(elisp) Documentation Tips' for background."
   :type 'boolean
   :version "28.1")
 
+;; This is how you can use checkdoc to make mass fixes on the Emacs
+;; source tree:
+;;
+;; (setq checkdoc--argument-missing-flag nil)      ; optional
+;; (setq checkdoc--disambiguate-symbol-flag nil)   ; optional
+;; (setq checkdoc--interactive-docstring-flag nil) ; optional
+;; Then use `M-x find-dired' ("-name '*.el'") and `M-x checkdoc-dired'
+
+(defvar checkdoc--argument-missing-flag t
+  "Non-nil means warn if arguments are missing from docstring.
+This variable is intended for use on Emacs itself, where the
+large number of libraries means it is impractical to fix all
+of these warnings en masse.  In almost any other case, setting
+this to anything but t is likely to be counter-productive.")
+
+(defvar checkdoc--disambiguate-symbol-flag t
+  "Non-nil means ask to disambiguate Lisp symbol.
+This variable is intended for use on Emacs itself, where the
+large number of libraries means it is impractical to fix all
+of these warnings masse.  In almost any other case, setting
+this to anything but t is likely to be counter-productive.")
+
+(defvar checkdoc--interactive-docstring-flag t
+  "Non-nil means warn if interactive function has no docstring.
+This variable is intended for use on Emacs itself, where the
+large number of libraries means it is impractical to fix all
+of these warnings masse.  In almost any other case, setting
+this to anything but t is likely to be counter-productive.")
+
 ;;;###autoload
 (defun checkdoc-list-of-strings-p (obj)
   "Return t when OBJ is a list of strings."
@@ -370,6 +401,7 @@ See Info node `(elisp) Documentation Tips' for background."
     ("contains" . "contain")
     ("converts" . "convert")
     ("creates" . "create")
+    ("defines" . "define")
     ("destroys" . "destroy")
     ("determines" . "determine")
     ("disables" . "disable")
@@ -408,6 +440,7 @@ See Info node `(elisp) Documentation Tips' for background."
     ("performs" . "perform")
     ("prepares" . "prepare")
     ("prepends" . "prepend")
+    ("prompts" . "prompt")
     ("reads" . "read")
     ("raises" . "raise")
     ("removes" . "remove")
@@ -456,6 +489,9 @@ be re-created.")
     st)
   "Syntax table used by checkdoc in document strings.")
 
+(defconst checkdoc--help-buffer "*Checkdoc Help*"
+  "Name of buffer used for Checkdoc Help.")
+
 ;;; User level commands
 ;;
 ;;;###autoload
@@ -463,7 +499,7 @@ be re-created.")
   "Interactively check the entire buffer for style errors.
 The current status of the check will be displayed in a buffer which
 the users will view as each check is completed."
-  (interactive)
+  (interactive nil emacs-lisp-mode)
   (let ((status (list "Checking..." "-" "-" "-"))
        (checkdoc-spellcheck-documentation-flag
         (car (memq checkdoc-spellcheck-documentation-flag
@@ -530,7 +566,7 @@ buffer.  Allows navigation forward and backwards through 
document
 errors.  Does not check for comment or space warnings.
 Optional argument SHOWSTATUS indicates that we should update the
 checkdoc status window instead of the usual behavior."
-  (interactive "P")
+  (interactive "P" emacs-lisp-mode)
   (let ((checkdoc-spellcheck-documentation-flag
         (car (memq checkdoc-spellcheck-documentation-flag
                     '(interactive t)))))
@@ -551,7 +587,7 @@ buffer.  Allows navigation forward and backwards through 
document
 errors.  Does not check for comment or space warnings.
 Optional argument SHOWSTATUS indicates that we should update the
 checkdoc status window instead of the usual behavior."
-  (interactive "P")
+  (interactive "P" emacs-lisp-mode)
   (let ((checkdoc-spellcheck-documentation-flag
         (car (memq checkdoc-spellcheck-documentation-flag
                     '(interactive t)))))
@@ -703,31 +739,30 @@ style."
                      begin (point)))
               ;; Goofy stuff
               (t
-               (if (get-buffer-window "*Checkdoc Help*")
+                (if (get-buffer-window checkdoc--help-buffer)
                    (progn
-                     (delete-window (get-buffer-window "*Checkdoc Help*"))
-                     (kill-buffer "*Checkdoc Help*"))
-                 (with-output-to-temp-buffer "*Checkdoc Help*"
+                      (delete-window (get-buffer-window checkdoc--help-buffer))
+                      (kill-buffer checkdoc--help-buffer))
+                  (with-output-to-temp-buffer checkdoc--help-buffer
                     (with-current-buffer standard-output
                       (insert
                        "Checkdoc Keyboard Summary:\n"
                        (if (checkdoc-error-unfixable (car (car err-list)))
                            ""
                          (concat
-                          "f, y    - auto Fix this warning without asking (if\
- available.)\n"
-                          "         Very complex operations will still 
query.\n")
-                         )
+                          "f, y    - auto Fix this warning without asking"
+                          " (if available.)\n"
+                          "         Very complex operations will still 
query.\n"))
                        "e      - Enter recursive Edit.  Press C-M-c to exit.\n"
                        "SPC, n - skip to the Next error.\n"
                        "DEL, p - skip to the Previous error.\n"
                        "q      - Quit checkdoc.\n"
                        "C-h    - Toggle this help buffer.")))
                  (shrink-window-if-larger-than-buffer
-                  (get-buffer-window "*Checkdoc Help*"))))))
+                   (get-buffer-window checkdoc--help-buffer))))))
          (if cdo (delete-overlay cdo)))))
     (goto-char begin)
-    (if (get-buffer "*Checkdoc Help*") (kill-buffer "*Checkdoc Help*"))
+    (if (get-buffer checkdoc--help-buffer) (kill-buffer checkdoc--help-buffer))
     (message "Checkdoc: Done.")
     returnme))
 
@@ -821,19 +856,21 @@ assumes that the cursor is already positioned to perform 
the fix."
 (defun checkdoc-recursive-edit (msg)
   "Enter recursive edit to permit a user to fix some error checkdoc has found.
 MSG is the error that was found, which is displayed in a help buffer."
-  (with-output-to-temp-buffer "*Checkdoc Help*"
-    (mapc #'princ
-          (list "Error message:\n  " msg
-                "\n\nEdit to fix this problem, and press C-M-c to continue.")))
+  (with-output-to-temp-buffer checkdoc--help-buffer
+    (with-current-buffer standard-output
+      (insert "Error message:\n  " msg "\n\n"
+              (substitute-command-keys
+               "Edit to fix this problem, and press \\[exit-recursive-edit] to 
continue."))))
   (shrink-window-if-larger-than-buffer
-   (get-buffer-window "*Checkdoc Help*"))
-  (message "When you're done editing press C-M-c to continue.")
+   (get-buffer-window checkdoc--help-buffer))
+  (message (substitute-command-keys
+            "When you're done editing press \\[exit-recursive-edit] to 
continue."))
   (unwind-protect
       (recursive-edit)
-    (if (get-buffer-window "*Checkdoc Help*")
+    (if (get-buffer-window checkdoc--help-buffer)
        (progn
-         (delete-window (get-buffer-window "*Checkdoc Help*"))
-         (kill-buffer "*Checkdoc Help*")))))
+          (delete-window (get-buffer-window checkdoc--help-buffer))
+          (kill-buffer checkdoc--help-buffer)))))
 
 ;;;###autoload
 (defun checkdoc-eval-current-buffer ()
@@ -851,7 +888,7 @@ spacing are all verified."
 With a prefix argument (in Lisp, the argument TAKE-NOTES),
 store all errors found in a warnings buffer,
 otherwise stop after the first error."
-  (interactive "P")
+  (interactive "P" emacs-lisp-mode)
   (if (called-interactively-p 'interactive)
       (message "Checking buffer for style..."))
   ;; Assign a flag to spellcheck flag
@@ -890,7 +927,7 @@ Only documentation strings are checked.
 Use `checkdoc-continue' to continue checking if an error cannot be fixed.
 Prefix argument TAKE-NOTES means to collect all the warning messages into
 a separate buffer."
-  (interactive "P")
+  (interactive "P" emacs-lisp-mode)
   (let ((p (point)))
     (goto-char (point-min))
     (if (and take-notes (called-interactively-p 'interactive))
@@ -905,7 +942,7 @@ a separate buffer."
   "Find the next doc string in the current buffer which has a style error.
 Prefix argument TAKE-NOTES means to continue through the whole
 buffer and save warnings in a separate buffer."
-  (interactive "P")
+  (interactive "P" emacs-lisp-mode)
   (let ((wrong nil) (msg nil)
        ;; Assign a flag to spellcheck flag
        (checkdoc-spellcheck-documentation-flag
@@ -974,7 +1011,7 @@ don't move point."
 Prefix argument TAKE-NOTES non-nil means to save warnings in a
 separate buffer.  Otherwise print a message.  This returns the error
 if there is one."
-  (interactive "P")
+  (interactive "P" emacs-lisp-mode)
   (if take-notes (checkdoc-start-section "checkdoc-comments"))
   (if (not buffer-file-name)
       (error "Can only check comments for a file buffer"))
@@ -996,7 +1033,7 @@ Prefix argument TAKE-NOTES non-nil means to save warnings 
in a
 separate buffer.  Otherwise print a message.  This returns the error
 if there is one.
 Optional argument INTERACT permits more interactive fixing."
-  (interactive "P")
+  (interactive "P" emacs-lisp-mode)
   (if take-notes (checkdoc-start-section "checkdoc-rogue-spaces"))
   (let* ((checkdoc-autofix-flag (if take-notes 'never checkdoc-autofix-flag))
         (e (checkdoc-rogue-space-check-engine nil nil interact))
@@ -1013,7 +1050,7 @@ Optional argument INTERACT permits more interactive 
fixing."
 (defun checkdoc-message-text (&optional take-notes)
   "Scan the buffer for occurrences of the error function, and verify text.
 Optional argument TAKE-NOTES causes all errors to be logged."
-  (interactive "P")
+  (interactive "P" emacs-lisp-mode)
   (if take-notes (checkdoc-start-section "checkdoc-message-text"))
   (let* ((p (point)) e
         (checkdoc-autofix-flag (if take-notes 'never checkdoc-autofix-flag))
@@ -1065,6 +1102,39 @@ space at the end of each line."
         (if (called-interactively-p 'interactive)
             (message "Checkdoc: done."))))))
 
+(defconst checkdoc--dired-skip-lines-re
+  (rx (or (seq bol
+               (or ";; Generated from Unicode data files by unidat"
+                   ";; This file is automatically generated from"
+                   ";;   Generated by the command "))
+          ".el --- automatically extracted autoloads  -*- lexical-binding: t 
-*-"
+          ";;; lisp/trampver.el.  Generated from trampver.el.in by 
configure."))
+  "Regexp that when it matches tells `checkdoc-dired' to skip a file.")
+
+(defun checkdoc-dired (files)
+  "In Dired, run `checkdoc' on marked files.
+Skip anything that doesn't have the Emacs Lisp library file
+extension (\".el\").
+When called from Lisp, FILES is a list of filenames."
+  (interactive
+   (list
+    (delq nil
+          (mapcar
+           ;; skip anything that doesn't look like an Emacs Lisp library
+           (lambda (f) (if (equal (file-name-extension f) "el") f nil))
+           (nreverse (dired-map-over-marks (dired-get-filename) nil)))))
+   dired-mode)
+  (if (null files)
+      (error "No files to run checkdoc on")
+    (save-window-excursion
+      (dolist (fil files)
+        (find-file fil)
+        (unless (and
+                 (goto-char (point-min))
+                 (re-search-forward checkdoc--dired-skip-lines-re nil t))
+          (checkdoc)))))
+  (message "checkdoc-dired: Successfully checked %d files" (length files)))
+
 ;;; Ispell interface for forcing a spell check
 ;;
 
@@ -1227,8 +1297,8 @@ TEXT, START, END and UNFIXABLE conform to
 
 ;; Add in a menubar with easy-menu
 
-(easy-menu-define
-  nil checkdoc-minor-mode-map "Checkdoc Minor Mode Menu"
+(easy-menu-define nil checkdoc-minor-mode-map
+  "Checkdoc Minor Mode Menu."
   '("CheckDoc"
     ["Interactive Buffer Style Check" checkdoc t]
     ["Interactive Buffer Style and Spelling Check" checkdoc-ispell t]
@@ -1270,8 +1340,6 @@ checking of documentation strings.
 
 ;;; Subst utils
 ;;
-(define-obsolete-function-alias 'checkdoc-run-hooks
-  #'run-hook-with-args-until-success "28.1")
 
 (defsubst checkdoc-create-common-verbs-regexp ()
   "Rebuild the contents of `checkdoc-common-verbs-regexp'."
@@ -1348,7 +1416,7 @@ buffer, otherwise stop after the first error."
               (if (or (eq checkdoc-autofix-flag
                           'automatic-then-never)
                       (checkdoc-y-or-n-p
-                       "Convert comment to documentation? "))
+                        "Convert comment to documentation?"))
                   (save-excursion
                     ;; Our point is at the beginning of the comment!
                     ;; Insert a quote, then remove the comment chars.
@@ -1378,12 +1446,13 @@ buffer, otherwise stop after the first error."
                 (checkdoc-create-error
                  "You should convert this comment to documentation"
                  (point) (line-end-position)))
-            (checkdoc-create-error
-             (if (nth 2 fp)
-                 "All interactive functions should have documentation"
-               "All variables and subroutines might as well have a \
+             (when checkdoc--interactive-docstring-flag
+               (checkdoc-create-error
+                (if (nth 2 fp)
+                    "All interactive functions should have documentation"
+                  "All variables and subroutines might as well have a \
 documentation string")
-             (point) (+ (point) 1) t)))))
+                (point) (+ (point) 1) t))))))
     (if (and (not err) (= (following-char) ?\"))
         (with-syntax-table checkdoc-syntax-table
           (checkdoc-this-string-valid-engine fp take-notes))
@@ -1417,7 +1486,7 @@ buffer, otherwise stop after the first error."
                (looking-at "\\([ \t]+\\)[^ \t\n]"))
           (if (checkdoc-autofix-ask-replace (match-beginning 1)
                                             (match-end 1)
-                                            "Remove this whitespace? "
+                                             "Remove this whitespace?"
                                             "")
               nil
             (checkdoc-create-error
@@ -1430,7 +1499,7 @@ buffer, otherwise stop after the first error."
          (when (re-search-forward "^(" e t)
            (if (checkdoc-autofix-ask-replace (match-beginning 0)
                                      (match-end 0)
-                                     (format-message "Escape this `('? ")
+                                     (format-message "Escape this `('?")
                                      "\\(")
                nil
              (checkdoc-create-error
@@ -1448,7 +1517,7 @@ buffer, otherwise stop after the first error."
                     (setq start (point)
                           end (1- e)))))
           (if (checkdoc-autofix-ask-replace
-               start end "Remove this whitespace? " "")
+                start end "Remove this whitespace?" "")
               nil
             (checkdoc-create-error
              "Documentation strings should not start or end with whitespace"
@@ -1473,7 +1542,7 @@ buffer, otherwise stop after the first error."
             nil
           (forward-char 1)
           (if (checkdoc-autofix-ask-replace
-               (point) (1+ (point)) "Add period to sentence? "
+                (point) (1+ (point)) "Add period to sentence?"
                ".\"" t)
               nil
             (checkdoc-create-error
@@ -1494,7 +1563,7 @@ buffer, otherwise stop after the first error."
               ;; Here we have found a complete sentence, but no break.
               (if (checkdoc-autofix-ask-replace
                    (1+ (match-beginning 0)) (match-end 0)
-                   "First line not a complete sentence.  Add RET here? "
+                    "First line not a complete sentence.  Add RET here?"
                    "\n" t)
                   (let (l1 l2)
                     (end-of-line 2)
@@ -1521,7 +1590,7 @@ may require more formatting")
                        (< (current-column) numc))
                   (when (checkdoc-autofix-ask-replace
                          p (1+ p)
-                         "1st line not a complete sentence.  Join these lines? 
"
+                          "First line not a complete sentence.  Join these 
lines?"
                          " " t)
                     (setq msg nil)))))
           (if msg
@@ -1534,7 +1603,7 @@ may require more formatting")
        (if (looking-at "[a-z]")
           (if (checkdoc-autofix-ask-replace
                (match-beginning 0) (match-end 0)
-               "Capitalize your sentence? " (upcase (match-string 0))
+                "Capitalize your sentence?" (upcase (match-string 0))
                t)
               nil
             (checkdoc-create-error
@@ -1545,7 +1614,9 @@ may require more formatting")
      ;;     Instead, use the `\\[...]' construct to stand for them.
      (save-excursion
        (let ((f nil) (m nil) (start (point))
-            (re "[^`‘A-Za-z0-9_]\\([CMA]-[a-zA-Z]\\|\\(\\([CMA]-\\)?\
+             ;; Ignore the "A-" modifier: it is uncommon in practice,
+             ;; and leads to false positives in regexp ranges.
+             (re "[^`‘A-Za-z0-9_]\\([CMs]-[a-zA-Z]\\|\\(\\([CMs]-\\)?\
 mouse-[0-3]\\)\\)\\>"))
         ;; Find the first key sequence not in a sample
         (while (and (not f) (setq m (re-search-forward re e t)))
@@ -1581,13 +1652,14 @@ mouse-[0-3]\\)\\)\\>"))
             (setq mb (match-beginning 1)
                   me (match-end 1))
             (if (and sym (boundp sym) (fboundp sym)
+                      checkdoc--disambiguate-symbol-flag
                      (save-excursion
                        (goto-char mb)
                        (forward-word-strictly -1)
                        (not (looking-at
                              
"variable\\|option\\|function\\|command\\|symbol"))))
                 (if (checkdoc-autofix-ask-replace
-                     mb me "Prefix this ambiguous symbol? " ms1 t)
+                      mb me "Prefix this ambiguous symbol?" ms1 t)
                     ;; We didn't actually replace anything.  Here we find
                     ;; out what special word form they wish to use as
                     ;; a prefix.
@@ -1646,7 +1718,7 @@ function,command,variable,option or symbol." ms1))))))
             (when (looking-at "\"\\*?\\(True\\)\\b")
                (if (checkdoc-autofix-ask-replace
                     (match-beginning 1) (match-end 1)
-                    "Say \"Non-nil\" instead of \"True\"? "
+                    "Say \"Non-nil\" instead of \"True\"?"
                     "Non-nil")
                    nil
                  (checkdoc-create-error
@@ -1671,7 +1743,7 @@ function,command,variable,option or symbol." ms1))))))
             ;;           (concat (car fp) "-flag"))))
             ;;       (if (checkdoc-y-or-n-p
             ;;         (format
-            ;;          "Rename to %s and Query-Replace all occurrences? "
+             ;;         "Rename to %s and Query-Replace all occurrences?"
             ;;          newname))
             ;;           (progn
             ;;          (beginning-of-defun)
@@ -1734,7 +1806,7 @@ function,command,variable,option or symbol." ms1))))))
                             (if (checkdoc-autofix-ask-replace
                                  (match-beginning 1) (match-end 1)
                                  (format-message
-                                  "If this is the argument `%s', it should 
appear as %s.  Fix? "
+                                   "If this is the argument `%s', it should 
appear as %s.  Fix?"
                                   (car args) (upcase (car args)))
                                  (upcase (car args)) t)
                                 (setq found (match-beginning 1))))))
@@ -1744,7 +1816,7 @@ function,command,variable,option or symbol." ms1))))))
                   ;; to the end of the documentation string.
                   (if (checkdoc-y-or-n-p
                        (format
-                        "Add %s documentation to end of doc string? "
+                         "Add %s documentation to end of doc string?"
                         (upcase (car args))))
                       ;; Now do some magic and invent a doc string.
                       (save-excursion
@@ -1758,11 +1830,12 @@ function,command,variable,option or symbol." ms1))))))
                                                  (looking-at "[.?!]")))
                             (insert "."))
                         nil)
-                    (checkdoc-create-error
-                     (format-message
-                      "Argument `%s' should appear (as %s) in the doc string"
-                      (car args) (upcase (car args)))
-                     s (marker-position e)))
+                     (when checkdoc--argument-missing-flag
+                       (checkdoc-create-error
+                        (format-message
+                         "Argument `%s' should appear (as %s) in the doc 
string"
+                         (car args) (upcase (car args)))
+                        s (marker-position e))))
                 (if (or (and order (eq order 'yes))
                         (and (not order) checkdoc-arguments-in-order-flag))
                     (if (< found last-pos)
@@ -1806,7 +1879,7 @@ function,command,variable,option or symbol." ms1))))))
                        (if (checkdoc-autofix-ask-replace
                             (match-beginning 1) (match-end 1)
                             (format "Use the imperative for \"%s\".  \
-Replace with \"%s\"? " original replace)
+Replace with \"%s\"?" original replace)
                             replace t)
                            (setq rs nil)))
                      (if rs
@@ -1820,7 +1893,7 @@ Replace with \"%s\"? " original replace)
             (when (looking-at "\"Return \\(true\\)\\b")
                (if (checkdoc-autofix-ask-replace
                     (match-beginning 1) (match-end 1)
-                    "Say \"non-nil\" instead of \"true\"? "
+                    "Say \"non-nil\" instead of \"true\"?"
                     "non-nil")
                    nil
                  (checkdoc-create-error
@@ -1854,7 +1927,7 @@ Replace with \"%s\"? " original replace)
                    (or (boundp found) (fboundp found)))
               (progn
                 (setq msg (format-message
-                            "Add quotes around Lisp symbol `%s'? " ms))
+                            "Add quotes around Lisp symbol `%s'?" ms))
                 (if (checkdoc-autofix-ask-replace
                      (match-beginning 1) (+ (match-beginning 1)
                                             (length ms))
@@ -1873,7 +1946,7 @@ Replace with \"%s\"? " original replace)
        (if (re-search-forward "\\([`‘]\\(t\\|nil\\)['’]\\)" e t)
           (if (checkdoc-autofix-ask-replace
                (match-beginning 1) (match-end 1)
-               (format "%s should not appear in quotes.  Remove? "
+                (format "%s should not appear in quotes.  Remove?"
                        (match-string 2))
                (match-string 2) t)
               nil
@@ -1889,9 +1962,7 @@ Replace with \"%s\"? " original replace)
      ;; and reliance on the Ispell program.
      (checkdoc-ispell-docstring-engine e take-notes)
      ;; User supplied checks
-     (save-excursion (run-hook-with-args-until-success 
'checkdoc-style-functions fp e))
-     ;; Done!
-     )))
+     (save-excursion (run-hook-with-args-until-success 
'checkdoc-style-functions fp e)))))
 
 (defun checkdoc-defun-info nil
   "Return a list of details about the current sexp.
@@ -2078,7 +2149,7 @@ If the offending word is in a piece of quoted text, then 
it is skipped."
                      (not (thing-at-point-looking-at
                            help-xref-url-regexp)))
                 (if (checkdoc-autofix-ask-replace
-                     b e (format "Text %s should be capitalized.  Fix? "
+                     b e (format "Text %s should be capitalized.  Fix?"
                                  text)
                      (capitalize text) t)
                     nil
@@ -2114,7 +2185,7 @@ If the offending word is in a piece of quoted text, then 
it is skipped."
                             (checkdoc-in-abbreviation-p b))
                   (if (checkdoc-autofix-ask-replace
                        b e
-                       "There should be two spaces after a period.  Fix? "
+                       "There should be two spaces after a period.  Fix?"
                        ".  ")
                       nil
                     (if errtxt
@@ -2231,7 +2302,7 @@ Optional argument INTERACT may permit the user to fix 
problems on the fly."
 News agents may remove it"
               s (match-beginning 0) e (match-end 0) f t)
         ;; If interactive is passed down, give them a chance to fix things.
-        (if (and interact (y-or-n-p (concat msg ". Fix? ")))
+         (if (and interact (y-or-n-p (concat msg ". Fix?")))
             (progn
               (checkdoc-recursive-edit msg)
               (setq msg nil)
@@ -2247,7 +2318,7 @@ News agents may remove it"
         ;; This is not a complex activity
         (if (checkdoc-autofix-ask-replace
              (match-beginning 1) (match-end 1)
-             "White space at end of line.  Remove? " "")
+              "White space at end of line.  Remove?" "")
             nil
           (setq msg "White space found at end of line"
                 s (match-beginning 1) e (match-end 1))))))
@@ -2284,7 +2355,7 @@ Code:, and others referenced in the style guide."
        (if (not (lm-summary))
           ;; This certifies as very complex so always ask unless
           ;; it's set to never
-          (if (checkdoc-y-or-n-p "There is no first line summary!  Add one? ")
+           (if (checkdoc-y-or-n-p "There is no first line summary!  Add one?")
               (progn
                 (goto-char (point-min))
                 (insert ";;; " fn fe " --- " (read-string "Summary: ") "\n"))
@@ -2315,7 +2386,7 @@ Code:, and others referenced in the style guide."
                  "You should have a summary line (\";;; .* --- .*\")"
                  nil nil t)))
              (if (checkdoc-y-or-n-p
-                  "You should have a \";;; Commentary:\", add one? ")
+                   "You should have a \";;; Commentary:\", add one?")
                  (insert "\n;;; Commentary:\n;; \n\n")
                (checkdoc-create-error
                 "You should have a section marked \";;; Commentary:\""
@@ -2343,7 +2414,7 @@ Code:, and others referenced in the style guide."
                  (re-search-forward "^(" nil t))
              (beginning-of-line)))
            (if (checkdoc-y-or-n-p
-                "You should have a \";;; History:\", add one? ")
+                 "You should have a \";;; History:\", add one?")
                (insert "\n;;; History:\n;; \n\n")
              (checkdoc-create-error
               "You should have a section marked \";;; History:\" or use a 
ChangeLog"
@@ -2369,7 +2440,7 @@ Code:, and others referenced in the style guide."
                      cont (looking-at "require\\s-+")))
              (if (and (not cont)
                       (checkdoc-y-or-n-p
-                       "There is no ;;; Code: marker.  Insert one? "))
+                        "There is no ;;; Code: marker.  Insert one?"))
                  (progn (goto-char pos)
                         (insert ";;; Code:\n\n")
                         nil)
@@ -2391,7 +2462,7 @@ Code:, and others referenced in the style guide."
                            "\\|^;;;[ \t]+ End of file[ \t]+"
                            (regexp-quote fn) "\\(" (regexp-quote fe) "\\)?")
                    nil t))
-             (if (checkdoc-y-or-n-p "No identifiable footer!  Add one? ")
+              (if (checkdoc-y-or-n-p "No identifiable footer!  Add one?")
                  (progn
                    (goto-char (point-max))
                    (insert "\n(provide '" fn ")\n\n;;; " fn fe " ends here\n"))
@@ -2455,10 +2526,18 @@ Return the message classification.
 Argument END is the maximum bounds to search in."
   (let ((return nil))
     (while (and (not return)
-               (re-search-forward
-                "(\\s-*\\(\\(\\w\\|\\s_\\)*error\\|\
-\\(\\w\\|\\s_\\)*y-or-n-p\\(-with-timeout\\)?\
-\\|checkdoc-autofix-ask-replace\\)[ \t\n]+" end t))
+                (re-search-forward
+                 (rx "("
+                     (* (syntax whitespace))
+                     (group
+                      (or (seq (* (group (or wordchar (syntax symbol))))
+                               "error")
+                          (seq (* (group (or wordchar (syntax symbol))))
+                               (or "y-or-n-p" "yes-or-no-p")
+                               (? (group "-with-timeout")))
+                          "checkdoc-autofix-ask-replace"))
+                     (+ (any "\n\t ")))
+                 end t))
       (let* ((fn (match-string 1))
             (type (cond ((string-match "error" fn)
                          'error)
@@ -2467,7 +2546,7 @@ Argument END is the maximum bounds to search in."
            (progn (forward-sexp 2)
                   (skip-chars-forward " \t\n")))
        (if (and (eq type 'y-or-n-p)
-                (looking-at "(format[ \t\n]+"))
+                 (looking-at (rx "(format" (? "-message") (+ (any " \t\n")))))
            (goto-char (match-end 0)))
        (skip-chars-forward " \t\n")
        (if (not (looking-at "\""))
@@ -2475,6 +2554,31 @@ Argument END is the maximum bounds to search in."
          (setq return type))))
     return))
 
+(defun checkdoc--fix-y-or-n-p ()
+  "Fix `y-or-n-p' prompt to end with \"?\" or \"? \".
+The space is technically redundant, but also more compatible with
+Emacs versions before Emacs 24.1.  In the future, we might treat
+a space as a style error."
+  (when (and (save-excursion (forward-sexp 1)
+                             (forward-char -3)
+                             (not (looking-at "\\? ")))
+             (save-excursion (forward-sexp 1)
+                             (forward-char -2)
+                             (not (looking-at "\\?"))))
+    (if (and
+         (save-excursion (forward-sexp 1)
+                         (forward-char -1)
+                         (looking-at "\""))
+         (checkdoc-autofix-ask-replace
+          (match-beginning 0) (match-end 0)
+          (format-message
+           "`y-or-n-p' argument should end with \"? \".  Fix?")
+          "?\"" t))
+        nil
+      (checkdoc-create-error
+       "`y-or-n-p' argument should end with \"?\""
+       (match-beginning 0) (match-end 0)))))
+
 (defun checkdoc-message-text-engine (&optional type)
   "Return or fix errors found in strings passed to a message display function.
 According to the documentation for the function `error', the error list
@@ -2501,7 +2605,7 @@ Argument TYPE specifies the type of question, such as 
`error' or `y-or-n-p'."
                              (looking-at "[a-z]\\w+"))
              (not (checkdoc-autofix-ask-replace
                    (match-beginning 0) (match-end 0)
-                   "Capitalize your message text? "
+                    "Capitalize your message text?"
                    (capitalize (match-string 0))
                    t)))
         (checkdoc-create-error
@@ -2523,64 +2627,21 @@ Argument TYPE specifies the type of question, such as 
`error' or `y-or-n-p'."
                              (looking-at "\\."))
              (not (checkdoc-autofix-ask-replace (match-beginning 0)
                                                 (match-end 0)
-                                                "Remove period from error? "
+                                                 "Remove period from error?"
                                                 ""
                                                 t)))
         (checkdoc-create-error
          "Error messages should *not* end with a period"
          (match-beginning 0) (match-end 0))
        nil)
-     ;; `y-or-n-p' documentation explicitly says:
-     ;; It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
-     ;; I added the ? requirement.  Without it, it is unclear that we
-     ;; ask a question and it appears to be an undocumented style.
-     (if (eq type 'y-or-n-p)
-        (if (not (save-excursion (forward-sexp 1)
-                                 (forward-char -3)
-                                 (not (looking-at "\\? "))))
-            nil
-          (if (save-excursion (forward-sexp 1)
-                              (forward-char -2)
-                              (looking-at "\\?"))
-              ;; If we see a ?, then replace with "? ".
-              (if (checkdoc-autofix-ask-replace
-                   (match-beginning 0) (match-end 0)
-                    (format-message
-                     "`y-or-n-p' argument should end with \"? \".  Fix? ")
-                   "? " t)
-                  nil
-                (checkdoc-create-error
-                 "`y-or-n-p' argument should end with \"? \""
-                 (match-beginning 0) (match-end 0)))
-            (if (save-excursion (forward-sexp 1)
-                                (forward-char -2)
-                                (looking-at " "))
-                (if (checkdoc-autofix-ask-replace
-                     (match-beginning 0) (match-end 0)
-                      (format-message
-                       "`y-or-n-p' argument should end with \"? \".  Fix? ")
-                     "? " t)
-                    nil
-                  (checkdoc-create-error
-                   "`y-or-n-p' argument should end with \"? \""
-                   (match-beginning 0) (match-end 0)))
-              (if (and ;; if this isn't true, we have a problem.
-                   (save-excursion (forward-sexp 1)
-                                   (forward-char -1)
-                                   (looking-at "\""))
-                   (checkdoc-autofix-ask-replace
-                    (match-beginning 0) (match-end 0)
-                     (format-message
-                      "`y-or-n-p' argument should end with \"? \".  Fix? ")
-                    "? \"" t))
-                  nil
-                (checkdoc-create-error
-                 "`y-or-n-p' argument should end with \"? \""
-                 (match-beginning 0) (match-end 0)))))))
+     ;; From `(elisp) Programming Tips': "A question asked in the
+     ;; minibuffer with `yes-or-no-p' or `y-or-n-p' should start with
+     ;; a capital letter and end with '?'."
+     (when (eq type 'y-or-n-p)
+       (checkdoc--fix-y-or-n-p))
      ;; Now, let's just run the spell checker on this guy.
      (checkdoc-ispell-docstring-engine (save-excursion (forward-sexp 1)
-                                                      (point)))
-     )))
+                                                       (point))))))
 
 ;;; Auto-fix helper functions
 ;;
@@ -2750,6 +2811,8 @@ function called to create the messages."
 
 ;; Obsolete
 
+(define-obsolete-function-alias 'checkdoc-run-hooks
+  #'run-hook-with-args-until-success "28.1")
 (defvar checkdoc-version "0.6.2"
   "Release version of checkdoc you are currently running.")
 (make-obsolete-variable 'checkdoc-version 'emacs-version "28.1")
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index 4a69df15bc..1640975b84 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -960,7 +960,7 @@ Can only be used from within the lexical body of a primary 
or around method."
 ;;; Add support for describe-function
 
 (defun cl--generic-search-method (met-name)
-  "For `find-function-regexp-alist'.  Searches for a cl-defmethod.
+  "For `find-function-regexp-alist'.  Search for a `cl-defmethod'.
 MET-NAME is as returned by `cl--generic-load-hist-format'."
   (let ((base-re (concat "(\\(?:cl-\\)?defmethod[ \t]+"
                          (regexp-quote (format "%s" (car met-name)))
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 16308b3a59..6d6482c349 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -1762,7 +1762,7 @@ Once the END-TEST becomes true, the RESULT forms are 
evaluated (with
 the VARs still bound to their values) to produce the result
 returned by `cl-do'.
 
-Note that the entire loop is enclosed in an implicit `nil' block, so
+Note that the entire loop is enclosed in an implicit nil block, so
 that you can use `cl-return' to exit at any time.
 
 Also note that END-TEST is checked before evaluating BODY.  If END-TEST
@@ -1791,7 +1791,7 @@ Once the END-TEST becomes true, the RESULT forms are 
evaluated (with
 the VARs still bound to their values) to produce the result
 returned by `cl-do*'.
 
-Note that the entire loop is enclosed in an implicit `nil' block, so
+Note that the entire loop is enclosed in an implicit nil block, so
 that you can use `cl-return' to exit at any time.
 
 Also note that END-TEST is checked before evaluating BODY.  If END-TEST
@@ -2071,7 +2071,7 @@ Like `cl-flet' but the definitions can refer to previous 
ones.
   ;; even handle mutually recursive functions.
   (letrec
       ((done nil) ;; Non-nil if some TCO happened.
-       ;; This var always holds the value `nil' until (just before) we
+       ;; This var always holds the value nil until (just before) we
        ;; exit the loop.
        (retvar (make-symbol "retval"))
        (ofargs (mapcar (lambda (s) (if (memq s cl--lambda-list-keywords) s
diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el
index 6a3f6046d1..5518cdb4c9 100644
--- a/lisp/emacs-lisp/comp-cstr.el
+++ b/lisp/emacs-lisp/comp-cstr.el
@@ -134,7 +134,7 @@ Integer values are handled in the `range' slot.")
                     :neg (neg cstr))))
 
 (defsubst comp-cstr-empty-p (cstr)
-  "Return t if CSTR is equivalent to the `nil' type specifier or nil 
otherwise."
+  "Return t if CSTR is equivalent to the nil type specifier or nil otherwise."
   (with-comp-cstr-accessors
     (and (null (typeset cstr))
          (null (valset cstr))
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index bb135457e2..4060fc97d0 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -901,8 +901,8 @@ non local exit (ends with an `unreachable' insn)."))
   (lap () :type list
        :documentation "LAP assembly representation.")
   (ssa-status nil :type symbol
-       :documentation "SSA status either: 'nil', 'dirty' or 't'.
-Once in SSA form this *must* be set to 'dirty' every time the topology of the
+       :documentation "SSA status either: nil, `dirty' or t.
+Once in SSA form this *must* be set to `dirty' every time the topology of the
 CFG is mutated by a pass.")
   (frame-size nil :type integer)
   (vframe-size 0 :type integer)
@@ -3804,8 +3804,9 @@ Return the trampoline if found or nil otherwise."
 
 ;;;###autoload
 (defun comp-clean-up-stale-eln (file)
-  "Given FILE remove all its *.eln files in `native-comp-eln-load-path'
-sharing the original source filename (including FILE)."
+  "Remove all FILE*.eln* files found in `native-comp-eln-load-path'.
+The files to be removed are those produced from the original source
+filename (including FILE)."
   (when (string-match (rx "-" (group-n 1 (1+ hex)) "-" (1+ hex) ".eln" eos)
                       file)
     (cl-loop
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el
index 8da9fb7682..0592db85df 100644
--- a/lisp/emacs-lisp/debug.el
+++ b/lisp/emacs-lisp/debug.el
@@ -119,7 +119,7 @@ This is to optimize `debugger-make-xrefs'.")
 (defvar debugger-jumping-flag nil
   "Non-nil means that `debug-on-entry' is disabled.
 This variable is used by `debugger-jump', `debugger-step-through',
-and `debugger-reenable' to temporarily disable debug-on-entry.")
+and `debugger-reenable' to temporarily disable `debug-on-entry'.")
 
 (defvar inhibit-trace)                  ;Not yet implemented.
 
@@ -128,7 +128,7 @@ and `debugger-reenable' to temporarily disable 
debug-on-entry.")
 It is a list expected to take the form (CAUSE . REST)
 where CAUSE can be:
 - debug: called for entry to a flagged function.
-- t: called because of debug-on-next-call.
+- t: called because of `debug-on-next-call'.
 - lambda: same thing but via `funcall'.
 - exit: called because of exit of a flagged function.
 - error: called because of `debug-on-error'.")
@@ -335,7 +335,7 @@ Make functions into cross-reference buttons if DO-XREFS is 
non-nil."
 
 (defun debugger-setup-buffer (args)
   "Initialize the `*Backtrace*' buffer for entry to the debugger.
-That buffer should be current already and in debugger-mode."
+That buffer should be current already and in `debugger-mode'."
   (setq backtrace-frames (nthcdr
                           ;; Remove debug--implement-debug-on-entry and the
                           ;; advice's `apply' frame.
@@ -454,7 +454,7 @@ will be used, such as in a debug on exit from a frame."
   (exit-recursive-edit))
 
 (defun debugger-jump ()
-  "Continue to exit from this frame, with all debug-on-entry suspended."
+  "Continue to exit from this frame, with all `debug-on-entry' suspended."
   (interactive)
   (debugger-frame)
   (setq debugger-jumping-flag t)
@@ -464,7 +464,7 @@ will be used, such as in a debug on exit from a frame."
   (exit-recursive-edit))
 
 (defun debugger-reenable ()
-  "Turn all debug-on-entry functions back on.
+  "Turn all `debug-on-entry' functions back on.
 This function is put on `post-command-hook' by `debugger-jump' and
 removes itself from that hook."
   (setq debugger-jumping-flag nil)
@@ -695,7 +695,7 @@ Redefining FUNCTION also cancels it."
 ;;;###autoload
 (defun cancel-debug-on-entry (&optional function)
   "Undo effect of \\[debug-on-entry] on FUNCTION.
-If FUNCTION is nil, cancel debug-on-entry for all functions.
+If FUNCTION is nil, cancel `debug-on-entry' for all functions.
 When called interactively, prompt for FUNCTION in the minibuffer.
 To specify a nil argument interactively, exit with an empty minibuffer."
   (interactive
@@ -798,7 +798,7 @@ another symbol also cancels it."
 ;;;###autoload
 (defun cancel-debug-on-variable-change (&optional variable)
   "Undo effect of \\[debug-on-variable-change] on VARIABLE.
-If VARIABLE is nil, cancel debug-on-variable-change for all variables.
+If VARIABLE is nil, cancel `debug-on-variable-change' for all variables.
 When called interactively, prompt for VARIABLE in the minibuffer.
 To specify a nil argument interactively, exit with an empty minibuffer."
   (interactive
diff --git a/lisp/emacs-lisp/derived.el b/lisp/emacs-lisp/derived.el
index 43d6dfd3c8..5e9644d823 100644
--- a/lisp/emacs-lisp/derived.el
+++ b/lisp/emacs-lisp/derived.el
@@ -139,7 +139,7 @@ KEYWORD-ARGS:
                    A nil value means to simply use the same abbrev-table
                    as the parent.
            :after-hook FORM
-                   A single lisp form which is evaluated after the mode
+                   A single Lisp form which is evaluated after the mode
                    hooks have been run.  It should not be quoted.
            :interactive BOOLEAN
                    Whether the derived mode should be `interactive' or not.
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 7def9ff96a..4f3c05baa9 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -3571,7 +3571,7 @@ This is useful for exiting even if `unwind-protect' code 
may be executed."
 (defun edebug-set-initial-mode ()
   "Set the initial execution mode of Edebug.
 The mode is requested via the key that would be used to set the mode in
-edebug-mode."
+`edebug-mode'."
   (interactive)
   (let* ((old-mode edebug-initial-mode)
         (key (read-key-sequence
@@ -4468,7 +4468,7 @@ With prefix argument, make it a temporary breakpoint."
               'read-expression-history)))))))
   (edebug-modify-breakpoint t condition arg))
 
-(easy-menu-define edebug-menu edebug-mode-map "Edebug menus" edebug-mode-menus)
+(easy-menu-define edebug-menu edebug-mode-map "Edebug menus." 
edebug-mode-menus)
 
 
 ;;; Finalize Loading
diff --git a/lisp/emacs-lisp/eieio-base.el b/lisp/emacs-lisp/eieio-base.el
index ec7c899bdd..5414c32c34 100644
--- a/lisp/emacs-lisp/eieio-base.el
+++ b/lisp/emacs-lisp/eieio-base.el
@@ -252,7 +252,7 @@ This is used with the `object-write' method.")
               :documentation
               "Saving this object should make backup files.
 Setting to nil will mean no backups are made."))
-  "This special class enables persistence through save files
+  "This special class enables persistence through save files.
 Use the `object-write' method to write this object to disk.  The save
 format is Emacs Lisp code which calls the constructor for the saved
 object.  For this reason, only slots which do not have an `:initarg'
diff --git a/lisp/emacs-lisp/elint.el b/lisp/emacs-lisp/elint.el
index 0fba5938f3..32b2cbdb45 100644
--- a/lisp/emacs-lisp/elint.el
+++ b/lisp/emacs-lisp/elint.el
@@ -1035,7 +1035,7 @@ Insert HEADER followed by a blank line if non-nil."
     (sit-for 0)))
 
 (defun elint-set-mode-line (&optional on)
-  "Set the mode-line-process of the Elint log buffer."
+  "Set the `mode-line-process' of the Elint log buffer."
   (with-current-buffer (elint-get-log-buffer)
     (and (eq major-mode 'compilation-mode)
         (setq mode-line-process
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index 92acfe7246..d4d8510064 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -1958,9 +1958,9 @@ non-nil, returns the face for expected results.."
   nil)
 
 (defun ert--results-font-lock-function (enabledp)
-  "Redraw the ERT results buffer after font-lock-mode was switched on or off.
+  "Redraw the ERT results buffer after `font-lock-mode' was switched on or off.
 
-ENABLEDP is true if font-lock-mode is switched on, false
+ENABLEDP is true if `font-lock-mode' is switched on, false
 otherwise."
   (ert--results-update-ewoc-hf ert--results-ewoc ert--results-stats)
   (ewoc-refresh ert--results-ewoc)
diff --git a/lisp/emacs-lisp/ewoc.el b/lisp/emacs-lisp/ewoc.el
index ca29b6d8c9..68f94edafd 100644
--- a/lisp/emacs-lisp/ewoc.el
+++ b/lisp/emacs-lisp/ewoc.el
@@ -147,7 +147,7 @@ and (ewoc--node-nth dll -1) returns the last node."
   buffer pretty-printer header footer dll last-node hf-pp)
 
 (defmacro ewoc--set-buffer-bind-dll-let* (ewoc varlist &rest forms)
-  "Execute FORMS with ewoc--buffer selected as current buffer,
+  "Execute FORMS with `ewoc--buffer' selected as current buffer,
 `dll' bound to the dll, and VARLIST bound as in a let*.
 `dll' will be bound when VARLIST is initialized, but
 the current buffer will *not* have been changed.
diff --git a/lisp/emacs-lisp/faceup.el b/lisp/emacs-lisp/faceup.el
index 162c39634e..629029aabc 100644
--- a/lisp/emacs-lisp/faceup.el
+++ b/lisp/emacs-lisp/faceup.el
@@ -795,7 +795,7 @@ See `faceup-properties' for a list of tracked properties."
       nil
     (if (and (null pos)
              (faceup-has-any-text-property (point-min)))
-        ;; `pos' is `nil' and the character at `point-min' contains a
+        ;; `pos' is nil and the character at `point-min' contains a
         ;; tracked property, return `point-min'.
         (point-min)
       (unless pos
diff --git a/lisp/emacs-lisp/generator.el b/lisp/emacs-lisp/generator.el
index 2acf939bed..2075ac472d 100644
--- a/lisp/emacs-lisp/generator.el
+++ b/lisp/emacs-lisp/generator.el
@@ -668,7 +668,7 @@ sub-iterator function returns via `iter-end-of-sequence'."
          (iter-close ,valsym)))))
 
 (defmacro iter-defun (name arglist &rest body)
-  "Creates a generator NAME.
+  "Create a generator NAME that accepts ARGLIST as its arguments.
 When called as a function, NAME returns an iterator value that
 encapsulates the state of a computation that produces a sequence
 of values.  Callers can retrieve each value using `iter-next'."
diff --git a/lisp/emacs-lisp/hierarchy.el b/lisp/emacs-lisp/hierarchy.el
index 7466fc85df..58234852a0 100644
--- a/lisp/emacs-lisp/hierarchy.el
+++ b/lisp/emacs-lisp/hierarchy.el
@@ -1,4 +1,4 @@
-;;; hierarchy.el --- Library to create and display hierarchy structures  -*- 
lexical-binding: t; -*-
+;;; hierarchy.el --- Library to create and display hierarchical structures  
-*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2020-2021 Free Software Foundation, Inc.
 
@@ -22,7 +22,8 @@
 
 ;;; Commentary:
 
-;; Library to create, query, navigate and display hierarchy structures.
+;; Library to create, query, navigate and display hierarchical
+;; structures.
 
 ;; Creation: After having created a hierarchy with `hierarchy-new',
 ;; populate it by calling `hierarchy-add-tree' or
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index b3b1efc8d2..eac3c03cd1 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -627,7 +627,7 @@ Value for `adaptive-fill-function'."
 ;; encouraged to use 'lisp-data-mode' instead.
 (defun lisp-mode-variables (&optional lisp-syntax keywords-case-insensitive
                                       elisp)
-  "Common initialization routine for lisp modes.
+  "Common initialization routine for Lisp modes.
 The LISP-SYNTAX argument is used by code in inf-lisp.el and is
 \(uselessly) passed from pp.el, chistory.el, gnus-kill.el and
 score-mode.el.  KEYWORDS-CASE-INSENSITIVE non-nil means that for
diff --git a/lisp/emacs-lisp/map.el b/lisp/emacs-lisp/map.el
index 77431f0c59..e0af448eaf 100644
--- a/lisp/emacs-lisp/map.el
+++ b/lisp/emacs-lisp/map.el
@@ -5,7 +5,7 @@
 ;; Author: Nicolas Petton <nicolas@petton.fr>
 ;; Maintainer: emacs-devel@gnu.org
 ;; Keywords: extensions, lisp
-;; Version: 3.1
+;; Version: 3.2
 ;; Package-Requires: ((emacs "26"))
 
 ;; This file is part of GNU Emacs.
@@ -103,10 +103,14 @@ Returns the result of evaluating the form associated with 
MAP-VAR's type."
   (and (consp list) (atom (car list))))
 
 (cl-defgeneric map-elt (map key &optional default testfn)
-  "Lookup KEY in MAP and return its associated value.
+  "Look up KEY in MAP and return its associated value.
 If KEY is not found, return DEFAULT which defaults to nil.
 
-TESTFN is deprecated.  Its default depends on the MAP argument.
+TESTFN is the function to use for comparing keys.  It is
+deprecated because its default and valid values depend on the MAP
+argument.  Generally, alist keys are compared with `equal', plist
+keys with `eq', and hash-table keys with the hash-table's test
+function.
 
 In the base definition, MAP can be an alist, plist, hash-table,
 or array."
@@ -136,7 +140,7 @@ or array."
     :list (if (map--plist-p map)
               (let ((res (plist-member map key)))
                 (if res (cadr res) default))
-            (alist-get key map default nil testfn))
+            (alist-get key map default nil (or testfn #'equal)))
     :hash-table (gethash key map default)
     :array (if (map-contains-key map key)
                (aref map key)
@@ -147,7 +151,7 @@ or array."
 If KEY is already present in MAP, replace the associated value
 with VALUE.
 When MAP is an alist, test equality with TESTFN if non-nil,
-otherwise use `eql'.
+otherwise use `equal'.
 
 MAP can be an alist, plist, hash-table, or array."
   (declare (obsolete "use map-put! or (setf (map-elt ...) ...) instead" 
"27.1"))
@@ -157,7 +161,7 @@ MAP can be an alist, plist, hash-table, or array."
   (let ((tail map) last)
     (while (consp tail)
       (cond
-       ((not (equal key (car tail)))
+       ((not (eq key (car tail)))
         (setq last tail)
         (setq tail (cddr last)))
        (last
@@ -177,7 +181,7 @@ Keys not present in MAP are ignored.")
   ;; FIXME: Signal map-not-inplace i.s.o returning a different list?
   (if (map--plist-p map)
       (map--plist-delete map key)
-    (setf (alist-get key map nil t) nil)
+    (setf (alist-get key map nil t #'equal) nil)
     map))
 
 (cl-defmethod map-delete ((map hash-table) key)
diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el
index a2a5aaed04..8fc2986ab4 100644
--- a/lisp/emacs-lisp/nadvice.el
+++ b/lisp/emacs-lisp/nadvice.el
@@ -160,7 +160,7 @@ Each element has the form (WHERE BYTECODE STACK) where:
    (t (eval spec))))
 
 (defun advice--interactive-form (function)
-  ;; Like `interactive-form' but tries to avoid autoloading functions.
+  "Like `interactive-form' but tries to avoid autoloading functions."
   (when (commandp function)
     (if (not (and (symbolp function) (autoloadp (indirect-function function))))
         (interactive-form function)
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 7418b580e8..a204966644 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -426,7 +426,7 @@ synchronously."
   :version "28.1")
 
 (defcustom package-archive-column-width 8
-  "Column width for the Package status in the package menu."
+  "Column width for the Package archive in the package menu."
   :type 'number
   :version "28.1")
 
@@ -1586,7 +1586,7 @@ If the archive version is too new, signal an error."
         (if package
             (package--add-to-archive-contents package archive)
           (lwarn '(package refresh) :warning
-                 "Ignoring `nil' package on `%s' package archive" archive))))))
+                 "Ignoring nil package on `%s' package archive" archive))))))
 
 (defvar package--old-archive-priorities nil
   "Store currently used `package-archive-priorities'.
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index c6173c710f..a3498d2da8 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -201,7 +201,11 @@ Emacs Lisp manual for more information and examples."
 ;;;###autoload
 (defmacro pcase-exhaustive (exp &rest cases)
   "The exhaustive version of `pcase' (which see).
-If EXP fails to match any of the patterns in CASES, an error is signaled."
+If EXP fails to match any of the patterns in CASES, an error is
+signaled.
+
+In contrast, `pcase' will return nil if there is no match, but
+not signal an error."
   (declare (indent 1) (debug pcase))
   (let* ((x (gensym "x"))
          (pcase--dontwarn-upats (cons x pcase--dontwarn-upats)))
diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el
index 3e0d5aef02..d4838ff0f8 100644
--- a/lisp/emacs-lisp/shortdoc.el
+++ b/lisp/emacs-lisp/shortdoc.el
@@ -495,6 +495,9 @@ There can be any number of :example/:result elements."
    :eval (list 1 2 3))
   (number-sequence
    :eval (number-sequence 5 8))
+  (ensure-list
+   :eval (ensure-list "foo")
+   :eval (ensure-list '(1 2 3)))
   "Operations on Lists"
   (append
    :eval (append '("foo" "bar") '("zot")))
diff --git a/lisp/emacs-lisp/subr-x.el b/lisp/emacs-lisp/subr-x.el
index 4204d20249..3de666682f 100644
--- a/lisp/emacs-lisp/subr-x.el
+++ b/lisp/emacs-lisp/subr-x.el
@@ -62,7 +62,7 @@ Is equivalent to:
     (+ (- (/ (+ 5 20) 25)) 40)
 Note how the single `-' got converted into a list before
 threading."
-  (declare (indent 1)
+  (declare (indent 0)
            (debug (form &rest [&or symbolp (sexp &rest form)])))
   `(internal--thread-argument t ,@forms))
 
@@ -79,7 +79,7 @@ Is equivalent to:
     (+ 40 (- (/ 25 (+ 20 5))))
 Note how the single `-' got converted into a list before
 threading."
-  (declare (indent 1) (debug thread-first))
+  (declare (indent 0) (debug thread-first))
   `(internal--thread-argument nil ,@forms))
 
 (defsubst internal--listify (elt)
@@ -107,7 +107,7 @@ If ELT is of the form ((EXPR)), listify (EXPR) with a dummy 
symbol."
 (defun internal--build-binding (binding prev-var)
   "Check and build a single BINDING with PREV-VAR."
   (thread-first
-      binding
+    binding
     internal--listify
     internal--check-binding
     (internal--build-binding-value-form prev-var)))
diff --git a/lisp/emacs-lisp/testcover.el b/lisp/emacs-lisp/testcover.el
index f5a624bb61..cdd966e51c 100644
--- a/lisp/emacs-lisp/testcover.el
+++ b/lisp/emacs-lisp/testcover.el
@@ -333,7 +333,7 @@ vectors as well as conses."
 ;;;=========================================================================
 
 (defun testcover-mark (def)
-  "Marks one DEF (a function or macro symbol) to highlight its contained forms
+  "Mark one DEF (a function or macro symbol) to highlight its contained forms
 that did not get completely tested during coverage tests.
   A marking with the face `testcover-nohits' (default = red) indicates that the
 form was never evaluated.  A marking using the `testcover-1value' face
diff --git a/lisp/emacs-lisp/timer.el b/lisp/emacs-lisp/timer.el
index 44d70cde6b..382f6bb1fa 100644
--- a/lisp/emacs-lisp/timer.el
+++ b/lisp/emacs-lisp/timer.el
@@ -49,7 +49,7 @@
   function args                         ;What to do when triggered.
   idle-delay                            ;If non-nil, this is an idle-timer.
   psecs
-  ;; A timer may be created with `t' as the TIME, which means that we
+  ;; A timer may be created with t as the TIME, which means that we
   ;; want to run at specific integral multiples of `repeat-delay'.  We
   ;; then have to recompute this (because the machine may have gone to
   ;; sleep, etc).
diff --git a/lisp/emulation/cua-base.el b/lisp/emulation/cua-base.el
index b662049960..3976c1ea06 100644
--- a/lisp/emulation/cua-base.el
+++ b/lisp/emulation/cua-base.el
@@ -330,9 +330,9 @@ See `cua-set-mark' for details."
   "If non-nil, registers are supported via numeric prefix arg.
 If the value is t, any numeric prefix arg in the range 0 to 9 will be
 interpreted as a register number.
-If the value is `not-ctrl-u', using C-u to enter a numeric prefix is not
+If the value is `not-ctrl-u', using \\[universal-argument] to enter a numeric 
prefix is not
 interpreted as a register number.
-If the value is `ctrl-u-only', only numeric prefix entered with C-u is
+If the value is `ctrl-u-only', only numeric prefix entered with 
\\[universal-argument] is
 interpreted as a register number."
   :type '(choice (const :tag "Disabled" nil)
                 (const :tag "Enabled, but C-u arg is not a register" 
not-ctrl-u)
diff --git a/lisp/emulation/cua-rect.el b/lisp/emulation/cua-rect.el
index 0039092fd6..65ae2f192f 100644
--- a/lisp/emulation/cua-rect.el
+++ b/lisp/emulation/cua-rect.el
@@ -710,9 +710,11 @@ Mark is kept if keep-clear is 'keep and cleared if 
keep-clear is 'clear."
     (nreverse rect)))
 
 (defun cua--insert-rectangle (rect &optional below paste-column line-count)
-  "Insert rectangle as insert-rectangle, but don't set mark and exit with
+  "Insert rectangle RECT similarly to `insert-rectangle'.
+In contrast to `insert-rectangle', don't set mark and exit with
 point at either next to top right or below bottom left corner
-Notice: In overwrite mode, the rectangle is inserted as separate text lines."
+
+Note: In overwrite mode, the rectangle is inserted as separate text lines."
   (if (eq below 'auto)
       (setq below (and (bolp)
                        (or (eolp) (eobp) (= (1+ (point)) (point-max))))))
diff --git a/lisp/emulation/viper-ex.el b/lisp/emulation/viper-ex.el
index e93666956c..ef15779e1b 100644
--- a/lisp/emulation/viper-ex.el
+++ b/lisp/emulation/viper-ex.el
@@ -1798,7 +1798,7 @@ reversed."
                      set-cmd var auto-cmd-label)))
 
     (if (and ask-if-save
-            (y-or-n-p (format "Do you want to save this setting in %s "
+             (y-or-n-p (format "Do you want to save this setting in %s?"
                               viper-custom-file-name)))
        (progn
          (viper-save-string-in-file
@@ -1876,11 +1876,11 @@ reversed."
        (message "Type `i' to search for a specific topic"))
     (error (beep 1)
           (with-output-to-temp-buffer " *viper-info*"
-            (princ (format "
+            (princ "
 The Info file for Viper does not seem to be installed.
 
 This file is part of the standard distribution of Emacs.
-Please contact your system administrator. "))))))
+Please contact your system administrator. ")))))
 
 ;; Ex source command.
 ;; Loads the file specified as argument or viper-custom-file-name.
diff --git a/lisp/emulation/viper-init.el b/lisp/emulation/viper-init.el
index 8188971c0d..730ca0b5a2 100644
--- a/lisp/emulation/viper-init.el
+++ b/lisp/emulation/viper-init.el
@@ -246,19 +246,19 @@ that deletes a file.")
 
 ;; Some common error messages
 
-(defconst viper-SpuriousText "Spurious text after command"  "")
-(defconst viper-BadExCommand "Not an editor command"   "")
-(defconst viper-InvalidCommandArgument "Invalid command argument"   "")
-(defconst viper-NoPrevSearch "No previous search string"   "")
-(defconst viper-EmptyRegister "`%c': Nothing in this register"   "")
-(defconst viper-InvalidRegister "`%c': Invalid register"   "")
-(defconst viper-EmptyTextmarker "`%c': Text marker doesn't point anywhere"   
"")
-(defconst viper-InvalidTextmarker "`%c': Invalid text marker"   "")
-(defconst viper-InvalidViCommand "Invalid command"   "")
-(defconst viper-BadAddress "Ill-formed address"   "")
-(defconst viper-FirstAddrExceedsSecond "First address exceeds second"   "")
-(defconst viper-NoFileSpecified "No file specified"   "")
-(defconst viper-ViperBell "Viper bell"   "")
+(defconst viper-SpuriousText "Spurious text after command")
+(defconst viper-BadExCommand "Not an editor command")
+(defconst viper-InvalidCommandArgument "Invalid command argument")
+(defconst viper-NoPrevSearch "No previous search string")
+(defconst viper-EmptyRegister "`%c': Nothing in this register")
+(defconst viper-InvalidRegister "`%c': Invalid register")
+(defconst viper-EmptyTextmarker "`%c': Text marker doesn't point anywhere")
+(defconst viper-InvalidTextmarker "`%c': Invalid text marker")
+(defconst viper-InvalidViCommand "Invalid command")
+(defconst viper-BadAddress "Ill-formed address")
+(defconst viper-FirstAddrExceedsSecond "First address exceeds second")
+(defconst viper-NoFileSpecified "No file specified")
+(defconst viper-ViperBell "Viper bell")
 
 ;; Is t until viper-mode executes for the very first time.
 ;; Prevents recursive descend into startup messages.
@@ -282,7 +282,7 @@ Use `\\[viper-set-expert-level]' to change this.")
 ;; If non-nil, ISO accents will be turned on in insert/replace emacs states and
 ;; turned off in vi-state.  For some users, this behavior may be too
 ;; primitive.  In this case, use insert/emacs/vi state hooks.
-(defvar-local viper-automatic-iso-accents nil "")
+(defvar-local viper-automatic-iso-accents nil)
 ;; Set iso-accents-mode to ARG.  Check if it is bound first
 (defsubst viper-set-iso-accents-mode (arg)
   (if (boundp 'iso-accents-mode)
@@ -292,7 +292,7 @@ Use `\\[viper-set-expert-level]' to change this.")
 ;; Don't change this!
 (defvar viper-mule-hook-flag t)
 ;; If non-nil, the default intl.  input method is turned on.
-(defvar-local viper-special-input-method nil "")
+(defvar-local viper-special-input-method nil)
 
 ;; viper hook to run on input-method activation
 (defun viper-activate-input-method-action ()
@@ -355,7 +355,7 @@ it better fits your working style."
 ;; Replace mode and changing text
 
 ;; Hack used to pass global states around for short period of time
-(defvar-local viper-intermediate-command nil "")
+(defvar-local viper-intermediate-command nil)
 
 ;; This is used to pass the right Vi command key sequence to
 ;; viper-set-destructive-command whenever (this-command-keys) doesn't give the
@@ -365,7 +365,7 @@ it better fits your working style."
 (defconst viper-this-command-keys nil)
 
 ;; Indicates that the current destructive command has started in replace mode.
-(defvar-local viper-began-as-replace nil "")
+(defvar-local viper-began-as-replace nil)
 
 (defcustom viper-allow-multiline-replace-regions t
   "If non-nil, Viper will allow multi-line replace regions.
@@ -396,7 +396,7 @@ delete the text being replaced, as in standard Vi."
 ;; internal var, used to remember the default cursor color of emacs frames
 (defvar viper-vi-state-cursor-color nil)
 
-(defvar-local viper-replace-overlay nil "")
+(defvar-local viper-replace-overlay nil)
 (put 'viper-replace-overlay 'permanent-local t)
 
 (defcustom viper-replace-region-end-delimiter "$"
@@ -434,18 +434,18 @@ color displays.  By default, the delimiters are used only 
on TTYs."
 (put 'viper-last-posn-in-replace-region 'permanent-local t)
 (put 'viper-last-posn-while-in-insert-state 'permanent-local t)
 
-(defvar-local viper-sitting-in-replace nil "")
+(defvar-local viper-sitting-in-replace nil)
 (put 'viper-sitting-in-replace 'permanent-local t)
 
 ;; Remember the number of characters that have to be deleted in replace
 ;; mode to compensate for the inserted characters.
-(defvar-local viper-replace-chars-to-delete 0 "")
+(defvar-local viper-replace-chars-to-delete 0)
 ;; This variable is used internally by the before/after changed functions to
 ;; determine how many chars were deleted by the change.  This can't be
 ;; determined inside after-change-functions because those get the length of the
 ;; deleted region, not the number of chars deleted (which are two different
 ;; things under MULE).
-(defvar-local viper-replace-region-chars-deleted 0 "")
+(defvar-local viper-replace-region-chars-deleted 0)
 
 ;; Insertion ring and command ring
 (defcustom viper-insertion-ring-size 14
@@ -494,7 +494,7 @@ will make it hard to use Vi-style timeout macros."
 ;; Autoindent in insert
 
 ;; Variable that keeps track of whether C-t has been pressed.
-(defvar-local viper-cted nil "")
+(defvar-local viper-cted nil)
 
 ;; Preserve the indent value, used by C-d in insert mode.
 (defvar-local viper-current-indent 0)
@@ -502,14 +502,14 @@ will make it hard to use Vi-style timeout macros."
 ;; Whether to preserve the indent, used by C-d in insert mode.
 (defvar-local viper-preserve-indent nil)
 
-(defvar-local viper-auto-indent nil "")
+(defvar-local viper-auto-indent nil)
 (defcustom viper-auto-indent nil
   "Enable autoindent, if t.
 This is a buffer-local variable."
   :type 'boolean
   :group 'viper)
 
-(defvar-local viper-electric-mode t "")
+(defvar-local viper-electric-mode t)
 (defcustom viper-electric-mode t
   "If t, electrify Viper.
 Currently, this only electrifies auto-indentation, making it appropriate to the
@@ -595,7 +595,7 @@ to a new place after repeating previous Vi command."
 ;;; Variables for Moves and Searches
 
 (defgroup viper-search nil
-  "Variables that define the search and query-replace behavior of Viper."
+  "Variables that define the search and `query-replace' behavior of Viper."
   :prefix "viper-"
   :group 'viper)
 
@@ -658,14 +658,14 @@ negative number."
   :type 'boolean
   :group 'viper)
 
-(defvar-local viper-ex-style-motion t "")
+(defvar-local viper-ex-style-motion t)
 (defcustom viper-ex-style-motion t
   "If t, the commands l,h do not cross lines, etc (Ex-style).
 If nil, these commands cross line boundaries."
   :type 'boolean
   :group 'viper)
 
-(defvar-local viper-ex-style-editing t "")
+(defvar-local viper-ex-style-editing t)
 (defcustom viper-ex-style-editing t
   "If t, Ex-style behavior while editing in Vi command and insert states.
 `Backspace' and `Delete' don't cross line boundaries in insert.
@@ -677,14 +677,14 @@ If nil, the above commands can work across lines."
   :type 'boolean
   :group 'viper)
 
-(defvar-local viper-ESC-moves-cursor-back viper-ex-style-editing "")
+(defvar-local viper-ESC-moves-cursor-back viper-ex-style-editing)
 (defcustom viper-ESC-moves-cursor-back nil
   "If t, ESC moves cursor back when changing from insert to vi state.
 If nil, the cursor stays where it was when ESC was hit."
   :type 'boolean
   :group 'viper)
 
-(defvar-local viper-delete-backwards-in-replace nil "")
+(defvar-local viper-delete-backwards-in-replace nil)
 (defcustom viper-delete-backwards-in-replace nil
   "If t, DEL key will delete characters while moving the cursor backwards.
 If nil, the cursor will move backwards without deleting anything."
@@ -702,7 +702,7 @@ If nil, the cursor will move backwards without deleting 
anything."
   :tag "Search Wraps Around"
   :group 'viper-search)
 
-(defvar-local viper-related-files-and-buffers-ring nil "")
+(defvar-local viper-related-files-and-buffers-ring nil)
 (defcustom viper-related-files-and-buffers-ring nil
   "List of file and buffer names to consider related to the current buffer.
 Related buffers can be cycled through via :R and :P commands."
@@ -839,8 +839,7 @@ to customize the actual face object `viper-minibuffer-vi'
 this variable represents.")
 
 ;; the current face to be used in the minibuffer
-(defvar-local
-  viper-minibuffer-current-face viper-minibuffer-emacs-face "")
+(defvar-local viper-minibuffer-current-face viper-minibuffer-emacs-face)
 
 
 ;;; Miscellaneous
diff --git a/lisp/emulation/viper-keym.el b/lisp/emulation/viper-keym.el
index 75b627ea6a..2bb24f662f 100644
--- a/lisp/emulation/viper-keym.el
+++ b/lisp/emulation/viper-keym.el
@@ -69,7 +69,8 @@ major mode in effect."
   :group 'viper)
 
 (defcustom viper-want-ctl-h-help nil
-  "If non-nil, bind C-h to help-command; otherwise, C-h gets the usual Vi 
bindings."
+  "If non-nil, bind C-h to `help-command'.
+If nil, C-h gets the usual Vi bindings."
   :type 'boolean
   :group 'viper)
 
@@ -211,17 +212,17 @@ In insert mode, this key also functions as Meta."
 
 ;; Tells viper-add-local-keys to create a new viper-vi-local-user-map for new
 ;; buffers.  Not a user option.
-(defvar-local viper-need-new-vi-local-map t "")
+(defvar-local viper-need-new-vi-local-map t)
 (put 'viper-need-new-vi-local-map  'permanent-local t)
 
 ;; Tells viper-add-local-keys to create a new viper-insert-local-user-map for
 ;; new buffers.  Not a user option.
-(defvar-local viper-need-new-insert-local-map t "")
+(defvar-local viper-need-new-insert-local-map t)
 (put 'viper-need-new-insert-local-map  'permanent-local t)
 
 ;; Tells viper-add-local-keys to create a new viper-emacs-local-user-map for
 ;; new buffers.  Not a user option.
-(defvar-local viper-need-new-emacs-local-map t "")
+(defvar-local viper-need-new-emacs-local-map t)
 (put 'viper-need-new-emacs-local-map  'permanent-local t)
 
 
diff --git a/lisp/emulation/viper-mous.el b/lisp/emulation/viper-mous.el
index 98b123a7f4..02db39f1cb 100644
--- a/lisp/emulation/viper-mous.el
+++ b/lisp/emulation/viper-mous.el
@@ -65,8 +65,7 @@ or a triple-click."
 (defcustom viper-multiclick-timeout (if (viper-window-display-p)
                                         double-click-time
                                    500)
-  "Time interval in millisecond within which successive mouse clicks are
-considered related."
+  "Time interval in milliseconds for mouse clicks to be considered related."
   :type 'integer)
 
 ;; Local variable used to toggle wraparound search on click.
diff --git a/lisp/emulation/viper-util.el b/lisp/emulation/viper-util.el
index 8ff1cf91c0..0f6dceb13c 100644
--- a/lisp/emulation/viper-util.el
+++ b/lisp/emulation/viper-util.el
@@ -25,6 +25,7 @@
 ;;; Code:
 
 (require 'seq)
+(require 'cl-lib)
 
 ;; Compiler pacifier
 (defvar viper-minibuffer-current-face)
@@ -1091,14 +1092,11 @@ In addition, the symbol `_' may be considered 
alphanumeric if
 `viper-syntax-preference' is `strict-vi' or `reformed-vi'.")
 
 (defconst viper-strict-ALPHA-chars "a-zA-Z0-9_"
-  "Regexp matching the set of alphanumeric characters acceptable to strict
-Vi.")
+  "Regexp matching the set of alphanumeric characters acceptable to strict 
Vi.")
 (defconst viper-strict-SEP-chars " \t\n"
-  "Regexp matching the set of alphanumeric characters acceptable to strict
-Vi.")
+  "Regexp matching the set of alphanumeric characters acceptable to strict 
Vi.")
 (defconst viper-strict-SEP-chars-sans-newline " \t"
-  "Regexp matching the set of alphanumeric characters acceptable to strict
-Vi.")
+  "Regexp matching the set of alphanumeric characters acceptable to strict 
Vi.")
 
 (defconst viper-SEP-char-class " -"
   "String of syntax classes for Vi separators.
diff --git a/lisp/epa-dired.el b/lisp/epa-dired.el
index 8a4f8933bf..18f3f05574 100644
--- a/lisp/epa-dired.el
+++ b/lisp/epa-dired.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'epa)
diff --git a/lisp/epa-file.el b/lisp/epa-file.el
index 33bf5adabe..fe187589aa 100644
--- a/lisp/epa-file.el
+++ b/lisp/epa-file.el
@@ -21,8 +21,9 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
-;;; Dependencies
 
 (require 'epa)
 (require 'epa-hook)
diff --git a/lisp/epa-hook.el b/lisp/epa-hook.el
index 99a432c236..aa196851d4 100644
--- a/lisp/epa-hook.el
+++ b/lisp/epa-hook.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (defgroup epa-file nil
diff --git a/lisp/epa-mail.el b/lisp/epa-mail.el
index b9dd437ed1..9b3aa0c7fd 100644
--- a/lisp/epa-mail.el
+++ b/lisp/epa-mail.el
@@ -21,8 +21,9 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
-;;; Dependencies
 
 (require 'epa)
 (require 'mail-utils)
diff --git a/lisp/epa.el b/lisp/epa.el
index ed1dae3e8a..57d355cb3e 100644
--- a/lisp/epa.el
+++ b/lisp/epa.el
@@ -20,8 +20,9 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
-;;; Dependencies
 
 (require 'epg)
 (eval-when-compile (require 'subr-x))
@@ -461,7 +462,7 @@ q  trust status questionable.  -  trust status unspecified.
 ;;;###autoload
 (defun epa-select-keys (context prompt &optional names secret)
   "Display a user's keyring and ask him to select keys.
-CONTEXT is an epg-context.
+CONTEXT is an `epg-context'.
 PROMPT is a string to prompt with.
 NAMES is a list of strings to be matched with keys.  If it is nil, all
 the keys are listed.
@@ -968,8 +969,7 @@ For example:
 
 ;;;###autoload
 (defun epa-verify-cleartext-in-region (start end)
-  "Verify OpenPGP cleartext signed messages in the current region
-between START and END.
+  "Verify OpenPGP cleartext signed messages in current region from START to 
END.
 
 Don't use this command in Lisp programs!
 See the reason described in the `epa-verify-region' documentation."
@@ -1202,8 +1202,7 @@ If no one is selected, symmetric encryption will be 
performed.  ")
 
 ;;;###autoload
 (defun epa-import-armor-in-region (start end)
-  "Import keys in the OpenPGP armor format in the current region
-between START and END."
+  "Import keys in the OpenPGP armor format in the current region from START to 
END."
   (interactive "r")
   (save-excursion
     (save-restriction
diff --git a/lisp/epg.el b/lisp/epg.el
index a461afac34..ea7aa869a0 100644
--- a/lisp/epg.el
+++ b/lisp/epg.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 ;;; Prelude
 
@@ -433,7 +435,11 @@ callback data (if any)."
      (and user-id
          (concat " "
                  (if (stringp user-id)
-                     (rfc6068-unhexify-string user-id)
+                      (if (= (length user-id) (string-bytes user-id))
+                          ;; This is ASCII, possibly %-encoded.
+                         (rfc6068-unhexify-string user-id)
+                        ;; Non-ASCII, return as is.
+                        user-id)
                    (epg-decode-dn user-id))))
      (and (epg-signature-validity signature)
          (format " (trust %s)"  (epg-signature-validity signature)))
@@ -800,7 +806,7 @@ callback data (if any)."
   (when (and epg-key-id
             (string-match "\\`passphrase\\." string))
     (unless (epg-context-passphrase-callback context)
-      (error "passphrase-callback not set"))
+      (error "Variable `passphrase-callback' not set"))
     (let (inhibit-quit
          passphrase
          passphrase-with-new-line
diff --git a/lisp/erc/erc-autoaway.el b/lisp/erc/erc-autoaway.el
index bbab37fd5d..f7de61ce79 100644
--- a/lisp/erc/erc-autoaway.el
+++ b/lisp/erc/erc-autoaway.el
@@ -43,8 +43,7 @@ This is only used when `erc-autoaway-idle-method' is set to 
`emacs'.")
   "The last time the user sent something.")
 
 (defvar erc-autoaway-caused-away nil
-  "Indicates whether this module was responsible for setting the
-user's away status.")
+  "Non-nil if this module was responsible for setting the user's away status.")
 
 (defvar erc-autoaway-idle-seconds)
 
@@ -228,8 +227,7 @@ NONE-ALIVE-FUNC is the function to call if no ERC processes 
are alive."
       (when none-alive-func (funcall none-alive-func)))))
 
 (defun erc-autoaway-some-open-server-buffer ()
-  "Return some ERC server buffer if its connection is alive and the
-user is not away.
+  "Return some ERC server buffer if its connection is alive and user is not 
away.
 If none is found, return nil."
   (car (erc-buffer-list (lambda ()
                          (and (erc-open-server-buffer-p)
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index ad9719380a..10be2965ad 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -233,8 +233,7 @@ This is useful for detecting hung connections.")
 This variable is only set in a server buffer.")
 
 (defvar-local erc-server-filter-data nil
-  "The data that arrived from the server
-but has not been processed yet.")
+  "The data that arrived from the server but has not been processed yet.")
 
 (defvar-local erc-server-duplicates (make-hash-table :test 'equal)
   "Internal variable used to track duplicate messages.")
@@ -278,16 +277,15 @@ Reconnection will happen automatically for any unexpected 
disconnection."
   :type 'boolean)
 
 (defcustom erc-server-reconnect-attempts 2
-  "The number of times that ERC will attempt to reestablish a
-broken connection, or t to always attempt to reconnect.
+  "Number of times that ERC will attempt to reestablish a broken connection.
+If t, always attempt to reconnect.
 
 This only has an effect if `erc-server-auto-reconnect' is non-nil."
   :type '(choice (const :tag "Always reconnect" t)
                  integer))
 
 (defcustom erc-server-reconnect-timeout 1
-  "The amount of time, in seconds, that ERC will wait between
-successive reconnect attempts.
+  "Number of seconds to wait between successive reconnect attempts.
 
 If a key is pressed while ERC is waiting, it will stop waiting."
   :type 'number)
@@ -446,7 +444,7 @@ Currently this is called by `erc-send-input'."
 
 (defun erc-forward-word ()
   "Move forward one word, ignoring any subword settings.
-If no subword-mode is active, then this is (forward-word)."
+If no `subword-mode' is active, then this is (forward-word)."
   (skip-syntax-forward "^w")
   (> (skip-syntax-forward "w") 0))
 
@@ -460,7 +458,7 @@ If POS is out of range, the value is nil."
 
 (defun erc-bounds-of-word-at-point ()
   "Return the bounds of word at point, or nil if we're not at a word.
-If no subword-mode is active, then this is
+If no `subword-mode' is active, then this is
 \(bounds-of-thing-at-point 'word)."
   (if (or (erc-word-at-arg-p (point))
           (erc-word-at-arg-p (1- (point))))
diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index b80f1832d7..147b90291a 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -81,7 +81,8 @@ IRC users."
 All values of the list must be uppercase strings.")
 
 (defvar erc-dcc-list nil
-  "List of DCC connections. Looks like:
+  "List of DCC connections.
+Looks like:
   ((:nick \"nick!user@host\" :type GET :peer proc
     :parent proc :size size :file file)
    (:nick \"nick!user@host\" :type CHAT :peer proc :parent proc)
@@ -163,8 +164,9 @@ All values of the list must be uppercase strings.")
 ;;; Misc macros and utility functions
 
 (defun erc-dcc-member (&rest args)
-  "Return the first matching entry in `erc-dcc-list' which satisfies the
-constraints given as a plist in ARGS.  Returns nil on no match.
+  "Return first matching entry in `erc-dcc-list' satisfying constraints in 
plist ARGS.
+
+Return nil on no match.
 
 The property :nick is treated specially, if it contains a `!' character,
 it is treated as a nick!user@host string, and compared with the :nick property
@@ -205,8 +207,7 @@ compared with `erc-nick-equal-p' which is IRC 
case-insensitive."
     result))
 
 (defun erc-pack-int (value)
-  "Convert an integer into a packed string in network byte order,
-which is big-endian."
+  "Convert integer into a packed string in network byte order, which is 
big-endian."
   ;; make sure value is not negative
   (when (< value 0)
     (error "ERC-DCC (erc-pack-int): packet size is negative"))
@@ -760,8 +761,7 @@ the matching regexp, or nil if none found."
   :type 'integer)
 
 (defcustom erc-dcc-pump-bytes nil
-  "If set to an integer, keep sending until that number of bytes are
-unconfirmed."
+  "If an integer, keep sending until that number of bytes are unconfirmed."
   :type '(choice (const nil) integer))
 
 (define-inline erc-dcc-get-parent (proc)
@@ -833,8 +833,7 @@ bytes sent."
 
 (defcustom erc-dcc-send-connect-hook
   '(erc-dcc-display-send erc-dcc-send-block)
-  "Hook run whenever the remote end of a DCC SEND offer connected to your
-listening port."
+  "Hook run when remote end of a DCC SEND offer connected to your listening 
port."
   :type 'hook)
 
 (defun erc-dcc-nick (plist)
@@ -865,7 +864,7 @@ listening port."
     (buffer-string)))
 
 (defun erc-dcc-send-file (nick file &optional pproc)
-  "Open a socket for incoming connections, and send a CTCP send request to the
+  "Open socket for incoming connections and send a CTCP send request to the
 other client."
   (interactive "sNick: \nfFile: ")
   (when (null pproc) (if (processp erc-server-process)
@@ -1028,11 +1027,11 @@ transfer is complete."
   :type 'hook)
 
 (defcustom erc-dcc-chat-connect-hook nil
-  ""
+  "" ; FIXME
   :type 'hook)
 
 (defcustom erc-dcc-chat-exit-hook nil
-  ""
+  "" ; FIXME
   :type 'hook)
 
 (defun erc-cmd-CREQ (line &optional _force)
diff --git a/lisp/erc/erc-fill.el b/lisp/erc/erc-fill.el
index 41256682c0..9f29b9dad9 100644
--- a/lisp/erc/erc-fill.el
+++ b/lisp/erc/erc-fill.el
@@ -97,15 +97,15 @@ function is called."
                  function))
 
 (defcustom erc-fill-static-center 27
-  "Column around which all statically filled messages will be
-centered.  This column denotes the point where the ` ' character
-between <nickname> and the entered text will be put, thus aligning
-nick names right and text left."
+  "Column around which all statically filled messages will be centered.
+This column denotes the point where the ` ' character between
+<nickname> and the entered text will be put, thus aligning nick
+names right and text left."
   :type 'integer)
 
 (defcustom erc-fill-variable-maximum-indentation 17
-  "If we indent a line after a long nick, don't indent more then this
-characters.  Set to nil to disable."
+  "Don't indent a line after a long nick more than this many characters.
+Set to nil to disable."
   :type 'integer)
 
 (defcustom erc-fill-column 78
diff --git a/lisp/erc/erc-identd.el b/lisp/erc/erc-identd.el
index 3821e298cd..8003900552 100644
--- a/lisp/erc/erc-identd.el
+++ b/lisp/erc/erc-identd.el
@@ -46,7 +46,8 @@
   :group 'erc)
 
 (defcustom erc-identd-port 8113
-  "Port to run the identd server on if not specified in the argument for
+  "Port to run the identd server on.
+This can be overridden by specifying an argument for
 `erc-identd-start'.
 
 This can be either a string or a number."
diff --git a/lisp/erc/erc-join.el b/lisp/erc/erc-join.el
index a4986918b6..2ed8622b85 100644
--- a/lisp/erc/erc-join.el
+++ b/lisp/erc/erc-join.el
@@ -123,7 +123,7 @@ This is called from a timer set up by 
`erc-autojoin-channels'."
       (erc-autojoin-channels server nick))))
 
 (defun erc-autojoin-server-match (candidate)
-  "Match the current network or server against CANDIDATE
+  "Match the current network or server against CANDIDATE.
 This should be a key from `erc-autojoin-channels-alist'."
   (or (eq candidate (erc-network))
       (and (stringp candidate)
diff --git a/lisp/erc/erc-log.el b/lisp/erc/erc-log.el
index ddd00afd73..7c5c495f9e 100644
--- a/lisp/erc/erc-log.el
+++ b/lisp/erc/erc-log.el
@@ -180,8 +180,7 @@ If you set this to nil, you may want to enable both
   :type 'boolean)
 
 (defcustom erc-log-write-after-insert nil
-  "If non-nil, write to log file when new text is added to a
-logged ERC buffer.
+  "If non-nil, write to log file when new text is added to a logged ERC buffer.
 
 If you set this to nil, you may want to enable both
 `erc-save-buffer-on-part' and `erc-save-queries-on-quit'."
@@ -195,8 +194,7 @@ This should ideally, be a \"catch-all\" coding system, like
   :type 'coding-system)
 
 (defcustom erc-log-filter-function nil
-  "If non-nil, pass text through the given function before writing it to
-a log file.
+  "If non-nil, pass text to this function before writing it to a log file.
 
 The function should take one argument, which is the text to filter."
   :type '(choice (function "Function")
@@ -361,7 +359,7 @@ function is a possible value for
   (concat (buffer-name buffer) ".txt"))
 
 (defun erc-generate-log-file-name-long (_buffer target nick server port)
-  "Generates a log-file name in the way ERC always did it.
+  "Generate a log-file name in the way ERC always did it.
 This results in a file name of the form #channel!nick@server:port.txt.
 This function is a possible value for `erc-generate-log-file-name-function'."
   (let ((file (concat
@@ -375,7 +373,7 @@ This function is a possible value for 
`erc-generate-log-file-name-function'."
 (declare-function erc-network-name "erc-networks" ())
 
 (defun erc-generate-log-file-name-network (buffer target nick server _port)
-  "Generates a log-file name using the network name rather than server name.
+  "Generate a log-file name using the network name rather than server name.
 This results in a file name of the form #channel!nick@network.txt.
 This function is a possible value for `erc-generate-log-file-name-function'."
   (require 'erc-networks)
diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el
index fb50e84f65..01d6e44d59 100644
--- a/lisp/erc/erc-match.el
+++ b/lisp/erc/erc-match.el
@@ -79,7 +79,7 @@ Useful to mark nicks from dangerous hosts."
   :type '(repeat regexp))
 
 (defcustom erc-current-nick-highlight-type 'keyword
-  "Determines how to highlight text in which your current nickname appears
+  "Determine how to highlight text in which your current nickname appears
 \(does not apply to text sent by you).
 
 The following values are allowed:
@@ -234,9 +234,9 @@ current-nick, keyword, pal, dangerous-host, fool."
   :type 'hook)
 
 (defcustom erc-match-exclude-server-buffer nil
-  "If true, don't perform match on the server buffer; this is
-useful for excluding all the things like MOTDs from the server
-and other miscellaneous functions."
+  "If true, don't perform match on the server buffer.
+This is useful for excluding all the things like MOTDs from the
+server and other miscellaneous functions."
   :version "24.3"
   :type 'boolean)
 
diff --git a/lisp/erc/erc-menu.el b/lisp/erc/erc-menu.el
index 1bee6ff2a6..2da1abb29a 100644
--- a/lisp/erc/erc-menu.el
+++ b/lisp/erc/erc-menu.el
@@ -103,8 +103,7 @@
   "ERC menu definition.")
 
 (defvar erc-menu-defined nil
-  "Internal variable used to keep track of whether we've defined the
-ERC menu yet.")
+  "Internal variable used to keep track of whether we've defined the ERC menu 
yet.")
 
 ;;;###autoload(autoload 'erc-menu-mode "erc-menu" nil t)
 (define-erc-module menu nil
diff --git a/lisp/erc/erc-notify.el b/lisp/erc/erc-notify.el
index 1ed056c277..d4f22ca0f5 100644
--- a/lisp/erc/erc-notify.el
+++ b/lisp/erc/erc-notify.el
@@ -40,13 +40,11 @@
   :group 'erc)
 
 (defcustom erc-notify-list nil
-  "List of nicknames you want to be notified about online/offline
-status change."
+  "List of nicknames you want to be notified about online/offline status 
change."
   :type '(repeat string))
 
 (defcustom erc-notify-interval 60
-  "Time interval (in seconds) for checking online status of notified
-people."
+  "Time interval (in seconds) for checking online status of notified people."
   :type 'integer)
 
 (defcustom erc-notify-signon-hook nil
diff --git a/lisp/erc/erc-pcomplete.el b/lisp/erc/erc-pcomplete.el
index 43330755a8..c846a1f003 100644
--- a/lisp/erc/erc-pcomplete.el
+++ b/lisp/erc/erc-pcomplete.el
@@ -53,8 +53,7 @@ add this string to nicks completed."
   :type 'string)
 
 (defcustom erc-pcomplete-order-nickname-completions t
-  "If t, channel nickname completions will be ordered such that
-the most recent speakers are listed first."
+  "If t, order nickname completions with the most recent speakers first."
   :type 'boolean)
 
 ;;;###autoload(autoload 'erc-completion-mode "erc-pcomplete" nil t)
diff --git a/lisp/erc/erc-sound.el b/lisp/erc/erc-sound.el
index e835c45af8..cb4c232aba 100644
--- a/lisp/erc/erc-sound.el
+++ b/lisp/erc/erc-sound.el
@@ -128,7 +128,7 @@ See also `play-sound-file'."
     (erc-log (format "Playing sound file %S" filepath))))
 
 (defun erc-toggle-sound (&optional arg)
-  "Toggles playing sounds on and off.
+  "Toggle playing sounds on and off.
 With positive argument, turns them on.  With any other argument
 turns sounds off."
   (interactive "P")
diff --git a/lisp/erc/erc-stamp.el b/lisp/erc/erc-stamp.el
index dde2556ddb..7d31bc971e 100644
--- a/lisp/erc/erc-stamp.el
+++ b/lisp/erc/erc-stamp.el
@@ -182,9 +182,9 @@ or `erc-send-modify-hook'."
                                         (erc-echo-timestamp dir ct))))))))
 
 (defvar-local erc-timestamp-last-window-width nil
-  "Stores the width of the last window that showed the current
-buffer. This is used by `erc-insert-timestamp-right' when the
-current buffer is not shown in any window.")
+  "The width of the last window that showed the current buffer.
+his is used by `erc-insert-timestamp-right' when the current
+buffer is not shown in any window.")
 
 (defvar-local erc-timestamp-last-inserted nil
   "Last timestamp inserted into the buffer.")
@@ -200,7 +200,7 @@ This is used when `erc-insert-timestamp-function' is set to
 `erc-timestamp-left-and-right'")
 
 (defcustom erc-timestamp-only-if-changed-flag t
-  "Insert timestamp only if its value changed since last insertion.
+  "Non-nil means insert timestamp only if its value changed since last 
insertion.
 If `erc-insert-timestamp-function' is `erc-insert-timestamp-left', a
 string of spaces which is the same size as the timestamp is added to
 the beginning of the line in its place.  If you use
@@ -316,10 +316,10 @@ printed just after each line's text (no alignment)."
        (erc-put-text-property from (1+ (point)) 'cursor-intangible t)))))
 
 (defun erc-insert-timestamp-left-and-right (_string)
-  "This is another function that can be assigned to
-`erc-insert-timestamp-function'.  If the date is changed, it will
-print a blank line, the date, and another blank line.  If the time is
-changed, it will then print it off to the right."
+  "This is another function that can be used with 
`erc-insert-timestamp-function'.
+If the date is changed, it will print a blank line, the date, and
+another blank line.  If the time is changed, it will then print
+it off to the right."
   (let* ((ct (current-time))
         (ts-left (erc-format-timestamp ct erc-timestamp-format-left))
         (ts-right (erc-format-timestamp ct erc-timestamp-format-right)))
diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el
index eb2a9712ac..5755384490 100644
--- a/lisp/erc/erc-track.el
+++ b/lisp/erc/erc-track.el
@@ -104,14 +104,13 @@ channel (353)."
   :type 'erc-message-type)
 
 (defcustom erc-track-exclude-server-buffer nil
-  "If true, don't perform tracking on the server buffer; this is
-useful for excluding all the things like MOTDs from the server and
-other miscellaneous functions."
+  "If true, don't perform tracking on the server buffer.
+This is useful for excluding all the things like MOTDs from the
+server and other miscellaneous functions."
   :type 'boolean)
 
 (defcustom erc-track-shorten-start 1
-  "This number specifies the minimum number of characters a channel name in
-the mode-line should be reduced to."
+  "Minimum number of characters for a channel name in the mode-line."
   :type 'number)
 
 (defcustom erc-track-shorten-cutoff 4
@@ -149,8 +148,7 @@ If nil instead of a function, shortening is disabled."
                 function))
 
 (defcustom erc-track-list-changed-hook nil
-  "Hook that is run whenever the contents of
-`erc-modified-channels-alist' changes.
+  "Hook run when the contents of `erc-modified-channels-alist' changes.
 
 This is useful for people that don't use the default mode-line
 notification but instead use a separate mechanism to provide
@@ -603,10 +601,9 @@ because the debugger also causes changes to the
 window-configuration.")
 
 (defun erc-modified-channels-update (&rest _args)
-  "This function updates the information in `erc-modified-channels-alist'
-according to buffer visibility.  It calls
-`erc-modified-channels-display' at the end.  This should usually be
-called via `window-configuration-change-hook'.
+  "Update `erc-modified-channels-alist' according to buffer visibility.
+It calls `erc-modified-channels-display' at the end.  This should
+usually be called via `window-configuration-change-hook'.
 ARGS are ignored."
   (interactive)
   (unless erc-modified-channels-update-inside
@@ -675,8 +672,7 @@ is displayed according to `erc-track-mouse-face'."
     name))
 
 (defun erc-modified-channels-display ()
-  "Set `erc-modified-channels-object'
-according to `erc-modified-channels-alist'.
+  "Set `erc-modified-channels-object' according to 
`erc-modified-channels-alist'.
 Use `erc-make-mode-line-buffer-name' to create buttons."
   (cond ((or (eq 'mostactive erc-track-switch-direction)
             (eq 'leastactive erc-track-switch-direction))
@@ -779,10 +775,10 @@ that face with highest priority in NEW-FACES is also a 
member of
         choice))))
 
 (defun erc-track-modified-channels ()
-  "Hook function for `erc-insert-post-hook' to check if the current
-buffer should be added to the mode line as a hidden, modified
-channel.  Assumes it will only be called when current-buffer
-is in `erc-mode'."
+  "Hook function for `erc-insert-post-hook'.
+Check if the current buffer should be added to the mode line as a
+hidden, modified channel.  Assumes it will only be called when
+the current buffer is in `erc-mode'."
   (let ((this-channel (or (erc-default-target)
                          (buffer-name (current-buffer)))))
     (if (and (not (erc-buffer-visible (current-buffer)))
@@ -858,8 +854,7 @@ is in `erc-mode'."
 ;;; Buffer switching
 
 (defvar erc-track-last-non-erc-buffer nil
-  "Stores the name of the last buffer you were in before activating
-`erc-track-switch-buffer'.")
+  "Name of the last buffer before activating `erc-track-switch-buffer'.")
 
 (defun erc-track-sort-by-activest ()
   "Sort erc-modified-channels-alist by activity.
@@ -869,9 +864,8 @@ That means the number of unseen messages in a channel."
              (lambda (a b) (> (nth 1 a) (nth 1 b))))))
 
 (defun erc-track-face-priority (face)
-  "Return a number indicating the priority of FACE in
-`erc-track-faces-priority-list'.  Lower number means higher
-priority.
+  "Return priority (a number) of FACE in `erc-track-faces-priority-list'.
+Lower number means higher priority.
 
 If face is not in `erc-track-faces-priority-list', it will have a
 higher number than any other face in that list."
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index d08796a78d..ac0c08bd3a 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -3,6 +3,7 @@
 ;; Copyright (C) 1997-2021 Free Software Foundation, Inc.
 
 ;; Author: Alexander L. Belikoff (alexander@belikoff.net)
+;; Maintainer: Amin Bandali <bandali@gnu.org>
 ;; Contributors: Sergey Berezin (sergey.berezin@cs.cmu.edu),
 ;;               Mario Lang (mlang@delysid.org),
 ;;               Alex Schroeder (alex@gnu.org)
@@ -11,10 +12,10 @@
 ;;               David Edmondson (dme@dme.org)
 ;;               Michael Olson (mwolson@gnu.org)
 ;;               Kelvin White (kwhite@gnu.org)
-;; Maintainer: Amin Bandali <bandali@gnu.org>
-;; Keywords: IRC, chat, client, Internet
-
 ;; Version: 5.3
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: IRC, chat, client, Internet
+;; URL: https://www.gnu.org/software/emacs/erc.html
 
 ;; This file is part of GNU Emacs.
 
@@ -157,9 +158,7 @@ parameters and authentication."
   :type 'string)
 
 (defcustom erc-try-new-nick-p t
-  "If the nickname you chose isn't available, and this option is non-nil,
-ERC should automatically attempt to connect with another nickname.
-
+  "Non-nil means attempt to connect with another nickname if nickname 
unavailable.
 You can manually set another nickname with the /NICK command."
   :group 'erc
   :type 'boolean)
@@ -328,15 +327,15 @@ Functions are passed a buffer as the first argument."
 
 
 (defvar-local erc-channel-users nil
-  "A hash table of members in the current channel, which
-associates nicknames with cons cells of the form:
+  "Hash table of members in the current channel.
+It associates nicknames with cons cells of the form:
 \(USER . MEMBER-DATA) where USER is a pointer to an
 erc-server-user struct, and MEMBER-DATA is a pointer to an
 erc-channel-user struct.")
 
 (defvar-local erc-server-users nil
-  "A hash table of users on the current server, which associates
-nicknames with erc-server-user struct instances.")
+  "Hash table of users on the current server.
+It associates nicknames with `erc-server-user' struct instances.")
 
 (defun erc-downcase (string)
   "Convert STRING to IRC standard conforming downcase."
@@ -380,13 +379,11 @@ If no server buffer exists, return nil."
   (last-message-time nil))
 
 (define-inline erc-get-channel-user (nick)
-  "Find the (USER . CHANNEL-DATA) element corresponding to NICK
-in the current buffer's `erc-channel-users' hash table."
+  "Find NICK in the current buffer's `erc-channel-users' hash table."
   (inline-quote (gethash (erc-downcase ,nick) erc-channel-users)))
 
 (define-inline erc-get-server-user (nick)
-  "Find the USER corresponding to NICK in the current server's
-`erc-server-users' hash table."
+  "Find NICK in the current server's `erc-server-users' hash table."
   (inline-letevals (nick)
     (inline-quote (erc-with-server-buffer
                    (gethash (erc-downcase ,nick) erc-server-users)))))
@@ -1383,8 +1380,7 @@ If BUFFER is nil, the current buffer is used."
          (null (erc-default-target)))))
 
 (defun erc-open-server-buffer-p (&optional buffer)
-  "Return non-nil if argument BUFFER is an ERC server buffer that
-has an open IRC process.
+  "Return non-nil if BUFFER is an ERC server buffer with an open IRC process.
 
 If BUFFER is nil, the current buffer is used."
   (and (erc-server-buffer-p buffer)
@@ -2724,9 +2720,8 @@ displayed hostnames."
   :type 'alist)
 
 (defun erc-canonicalize-server-name (server)
-  "Return the canonical network name for SERVER if any,
-otherwise `erc-server-announced-name'.  SERVER is matched against
-`erc-common-server-suffixes'."
+  "Return canonical network name for SERVER or `erc-server-announced-name'.
+SERVER is matched against `erc-common-server-suffixes'."
   (when server
     (or (cdar (cl-remove-if-not
                (lambda (net) (string-match (car net) server))
@@ -3560,8 +3555,7 @@ just as you provided it.  Use this command with care!"
 (put 'erc-cmd-QUOTE 'do-not-parse-args t)
 
 (defcustom erc-query-display 'window
-  "Indicates how to display query buffers when using the /QUERY
-command to talk to someone.
+  "How to display query buffers when using the /QUERY command to talk to 
someone.
 
 The default behavior is to display the message in a new window
 and bring it to the front.  See the documentation for
@@ -3802,6 +3796,24 @@ the message given by REASON."
                              (mapconcat #'identity people " ")))
     t))
 
+(defun erc-cmd-OPME ()
+  "Ask ChanServ to op the current nick in the current channel.
+
+This command assumes a ChanServ (channel service) available on
+the IRC network which accepts an \"op\" command that takes the
+channel name and the user's nick, and that the current nick is
+allowed to become an operator in the current channel (typically
+means that the user has a +o flag in the channel's access list)."
+  (erc-message "PRIVMSG"
+               (format "ChanServ op %s %s"
+                       (erc-default-target)
+                       (erc-current-nick))
+               nil))
+
+(defun erc-cmd-DEOPME ()
+  "Deop the current nick in the current channel."
+  (erc-cmd-DEOP (erc-current-nick)))
+
 (defun erc-cmd-TIME (&optional line)
   "Request the current time and date from the current server."
   (cond
@@ -4299,8 +4311,8 @@ disconnected, you should set this option to t."
   :type 'boolean)
 
 (defcustom erc-format-query-as-channel-p t
-  "If non-nil, format text from others in a query buffer like in a channel,
-otherwise format like a private message."
+  "If non-nil, format text from others in a query buffer like in a channel.
+Otherwise format like a private message."
   :group 'erc-query
   :type 'boolean)
 
@@ -4542,8 +4554,8 @@ always returns t."
   t)
 
 (defun erc-echo-notice-in-user-buffers (s parsed _buffer sender)
-  "Echo a private notice in all of the buffers for which SENDER
-is a member.  This function is designed to be added to either
+  "Echo a private notice in all of the buffers for which SENDER is a member.
+This function is designed to be added to either
 `erc-echo-notice-hook' or `erc-echo-notice-always-hook', and
 returns non-nil if there is at least one buffer for which the
 sender is a member.
@@ -4556,12 +4568,11 @@ See also: `erc-echo-notice-in-first-user-buffer',
       nil)))
 
 (defun erc-echo-notice-in-user-and-target-buffers (s parsed buffer sender)
-  "Echo a private notice in BUFFER and in all of the buffers for
-which SENDER is a member.  This function is designed to be added
-to either `erc-echo-notice-hook' or
-`erc-echo-notice-always-hook', and returns non-nil if there is
-at least one buffer for which the sender is a member or the
-default target.
+  "Echo a private notice in BUFFER and in all buffers for which SENDER is a 
member.
+This function is designed to be added to either
+`erc-echo-notice-hook' or `erc-echo-notice-always-hook', and
+returns non-nil if there is at least one buffer for which the
+sender is a member or the default target.
 
 See also: `erc-echo-notice-in-user-buffers',
 `erc-buffer-list-with-nick'."
@@ -4572,8 +4583,8 @@ See also: `erc-echo-notice-in-user-buffers',
       nil)))
 
 (defun erc-echo-notice-in-first-user-buffer (s parsed _buffer sender)
-  "Echo a private notice in one of the buffers for which SENDER
-is a member.  This function is designed to be added to either
+  "Echo a private notice in one of the buffers for which SENDER is a member.
+This function is designed to be added to either
 `erc-echo-notice-hook' or `erc-echo-notice-always-hook', and
 returns non-nil if there is at least one buffer for which the
 sender is a member.
@@ -5182,8 +5193,7 @@ See also: `erc-update-user' and 
`erc-update-channel-member'."
 (defun erc-update-channel-member (channel nick new-nick
                                           &optional add voice halfop op admin 
owner host login
                                           full-name info update-message-time)
-  "Update user and channel information for the user with
-nickname NICK in channel CHANNEL.
+  "Update user and channel for user with nickname NICK in channel CHANNEL.
 
 See also: `erc-update-current-channel-member'."
   (erc-with-buffer
@@ -5651,8 +5661,7 @@ Return non-nil only if we actually send anything."
 ;;           (run-hooks 'erc-send-post-hook))))))
 
 (defun erc-display-msg (line)
-  "Display LINE as a message of the user to the current target at the
-current position."
+  "Display LINE as a message of the user to the current target at point."
   (when erc-insert-this
     (let ((insert-position (point)))
       (insert (erc-format-my-nick))
@@ -6384,8 +6393,8 @@ See `erc-mode-line-format' for which characters are can 
be used."
   :type 'boolean)
 
 (defcustom erc-header-line-uses-help-echo-p t
-  "Show the contents of the header line in the echo area or as a tooltip
-when you move point into the header line."
+  "Show header line in echo area or as a tooltip
+when point moves to the header line."
   :group 'erc-mode-line-and-header
   :type 'boolean)
 
@@ -6474,8 +6483,7 @@ shortened server name instead."
           (t (buffer-name (current-buffer))))))
 
 (defun erc-format-away-status ()
-  "Return a formatted `erc-mode-line-away-status-format'
-if `erc-away' is non-nil."
+  "Return a formatted `erc-mode-line-away-status-format' if `erc-away' is 
non-nil."
   (let ((a (erc-away-time)))
     (if a
         (format-time-string erc-mode-line-away-status-format a)
diff --git a/lisp/eshell/em-pred.el b/lisp/eshell/em-pred.el
index 639098a9b9..75a803d3ad 100644
--- a/lisp/eshell/em-pred.el
+++ b/lisp/eshell/em-pred.el
@@ -553,7 +553,7 @@ that `ls -l' will show in the first column of its display."
          lst)))))
 
 (defun eshell-include-members (&optional invert-p)
-  "Include only lisp members matching a regexp."
+  "Include only Lisp members matching a regexp."
   (let ((delim (char-after))
        regexp end)
     (forward-char)
diff --git a/lisp/eshell/em-term.el b/lisp/eshell/em-term.el
index d199a939a3..f9d8acccf2 100644
--- a/lisp/eshell/em-term.el
+++ b/lisp/eshell/em-term.el
@@ -92,13 +92,13 @@ See also `eshell-visual-commands' and 
`eshell-visual-options'."
 
 (defcustom eshell-visual-options
   nil
-  "An alist of the form
+  "An alist of commands that present their output in a visual fashion.
+It has this form:
 
   ((COMMAND1 OPTION1 OPTION2...)
    (COMMAND2 OPTION1 ...))
 
-of commands with options that present their output in a visual
-fashion.  For example, a sensible entry would be
+For example, a sensible entry would be
 
   (\"git\" \"--help\" \"--paginate\")
 
diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el
index 5b400c74fc..e71edaf476 100644
--- a/lisp/eshell/em-unix.el
+++ b/lisp/eshell/em-unix.el
@@ -165,7 +165,8 @@ Otherwise, Emacs will attempt to use rsh to invoke du on 
the remote machine."
 (put 'eshell/man 'eshell-no-numeric-conversions t)
 
 (defun eshell/info (&rest args)
-  "Run the info command in-frame with the same behavior as command-line 
`info', ie:
+  "Run the info command in-frame with the same behavior as command-line `info'.
+For example:
   `info'           => goes to top info window
   `info arg1'      => IF arg1 is a file, then visits arg1
   `info arg1'      => OTHERWISE goes to top info window and then menu item arg1
diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el
index 1aac95e0b4..a2464ad4a9 100644
--- a/lisp/eshell/esh-cmd.el
+++ b/lisp/eshell/esh-cmd.el
@@ -116,9 +116,9 @@
                  (&optional form stub paring form-only))
 
 (defgroup eshell-cmd nil
-  "Executing an Eshell command is as simple as typing it in and
-pressing <RET>.  There are several different kinds of commands,
-however."
+  "Executing an Eshell command is as simple as typing it in and \
+pressing \\<eshell-mode-map>\\[eshell-send-input].
+There are several different kinds of commands, however."
   :tag "Command invocation"
   ;; :link '(info-link "(eshell)Command invocation")
   :group 'eshell)
diff --git a/lisp/eshell/esh-module.el b/lisp/eshell/esh-module.el
index 703179504c..97ffedae62 100644
--- a/lisp/eshell/esh-module.el
+++ b/lisp/eshell/esh-module.el
@@ -20,6 +20,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'esh-util)
diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el
index 5dc6a19305..fa9853ae00 100644
--- a/lisp/eshell/esh-var.el
+++ b/lisp/eshell/esh-var.el
@@ -45,7 +45,7 @@
 ;;
 ;;   $(lisp)
 ;;
-;; Returns result of lisp evaluation.  Note: Used alone like this, it
+;; Returns result of Lisp evaluation.  Note: Used alone like this, it
 ;; is identical to just saying (lisp); but with the variable expansion
 ;; form, the result may be interpolated a larger string, such as
 ;; '$(lisp)/other'.
diff --git a/lisp/face-remap.el b/lisp/face-remap.el
index c84742be5a..50302b9682 100644
--- a/lisp/face-remap.el
+++ b/lisp/face-remap.el
@@ -397,7 +397,7 @@ a top-level keymap, `text-scale-increase' or
 (defcustom buffer-face-mode-face 'variable-pitch
   "The face specification used by `buffer-face-mode'.
 It may contain any value suitable for a `face' text property,
-including a face name, a list of face names, a face-attribute
+including a face name, a list of face names, a face attribute
 plist, etc."
   :type '(choice (face)
                 (repeat :tag "List of faces" face)
diff --git a/lisp/faces.el b/lisp/faces.el
index a5aef757b1..7b96d938c5 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -1796,8 +1796,8 @@ If FRAME is nil, that stands for the selected frame."
 (defalias 'x-defined-colors 'defined-colors)
 
 (defun defined-colors-with-face-attributes (&optional frame foreground)
-  "Return a list of colors supported for a particular frame.
-See `defined-colors' for arguments and return value. In contrast
+  "Return a list of colors supported for a particular FRAME.
+See `defined-colors' for arguments and return value.  In contrast
 to `defined-colors' the elements of the returned list are color
 strings with text properties, that make the color names render
 with the color they represent as background color (if FOREGROUND
diff --git a/lisp/ffap.el b/lisp/ffap.el
index b6e419b2d6..db38016427 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -465,11 +465,11 @@ Returned values:
                             mesg) nil)
              ((string-match "not responding$" mesg) mesg)
              ;; v19:
-             ;; (file-error "connection failed" "permission denied"
+              ;; (file-error "Connection failed" "permission denied"
              ;;             "nonesuch" "ffap-machine-p")
-             ;; (file-error "connection failed" "host is unreachable"
+              ;; (file-error "Connection failed" "host is unreachable"
              ;;             "gopher.house.gov" "ffap-machine-p")
-             ;; (file-error "connection failed" "address already in use"
+              ;; (file-error "Connection failed" "address already in use"
              ;;             "ftp.uu.net" "ffap-machine-p")
              ((equal mesg "connection failed")
               (if (string= (downcase (nth 2 error)) "permission denied")
@@ -1088,8 +1088,8 @@ If a given RFC isn't in these then `ffap-rfc-path' is 
offered."
     (latex-mode "--:\\\\$+<>@-Z_[:alpha:]~*?" "<@" "@>;.,!:")
     (tex-mode "--:\\\\$+<>@-Z_[:alpha:]~*?" "<@" "@>;.,!:")
     )
-  "Alist of (MODE CHARS BEG END), where MODE is a symbol,
-possibly a major-mode name, or one of the symbols
+  "Alist of (MODE CHARS BEG END), where MODE is a symbol.
+This is possibly a major-mode name, or one of the symbols
 `file', `url', `machine', and `nocolon'.
 Function `ffap-string-at-point' uses the data fields as follows:
 1. find a maximal string of CHARS around point,
diff --git a/lisp/fileloop.el b/lisp/fileloop.el
index 45b9cea939..cd60600a25 100644
--- a/lisp/fileloop.el
+++ b/lisp/fileloop.el
@@ -44,6 +44,7 @@
 
 (defcustom fileloop-revert-buffers 'silent
   "Whether to revert files during fileloop operation.
+This can be one of:
   `silent' means to only do it if `revert-without-query' is applicable;
   t        means to offer to do it for all applicable files;
   nil      means never to do it"
diff --git a/lisp/files.el b/lisp/files.el
index b113ff32f2..2f7e936ff6 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -1584,7 +1584,7 @@ Signals a `file-already-exists' error if a file of the 
new name
 already exists unless optional fourth argument OK-IF-ALREADY-EXISTS
 is non-nil.  A number as fourth arg means request confirmation if
 the new name already exists.  This is what happens in interactive
-use with M-x."
+use with \\[execute-extended-command]."
   (interactive
    (let ((default-coding (or file-name-coding-system
                             default-file-name-coding-system))
@@ -2520,7 +2520,7 @@ Do you want to revisit the file normally now? ")))
       (current-buffer))))
 
 (defun insert-file-contents-literally (filename &optional visit beg end 
replace)
-  "Like `insert-file-contents', but only reads in the file literally.
+  "Like `insert-file-contents', but only read in the file literally.
 See `insert-file-contents' for an explanation of the parameters.
 A buffer may be modified in several ways after reading into the buffer,
 due to Emacs features such as format decoding, character code
diff --git a/lisp/filesets.el b/lisp/filesets.el
index 63f0e8ba3f..9182c53945 100644
--- a/lisp/filesets.el
+++ b/lisp/filesets.el
@@ -112,7 +112,8 @@
 (defvar filesets-updated-buffers nil
   "A list of buffers with updated menu bars.")
 (defvar filesets-menu-use-cached-flag nil
-  "Use cached data.  See `filesets-menu-ensure-use-cached' for details.")
+  "Non-nil means use cached data.
+See `filesets-menu-ensure-use-cached' for details.")
 (defvar filesets-update-cache-file-flag nil
   "Non-nil means the cache needs updating.")
 (defvar filesets-ignore-next-set-default nil
@@ -607,8 +608,8 @@ the filename."
        (:ignore-on-read-text t)
        ;; (:constraintp ,pic-cmd)
        ))))
-  "Alist of file patterns and external viewers for use with
-`filesets-find-or-display-file'.
+  "Alist of file patterns and external viewers.
+This is intended for use with `filesets-find-or-display-file'.
 
 Has the form ((FILE-PATTERN VIEWER PROPERTIES) ...), VIEWER being either a
 function or a command name as string.
@@ -1770,7 +1771,7 @@ User will be queried, if no fileset name is provided."
                      filesets-data nil)))
          (entry  (or (assoc name filesets-data)
                      (when (y-or-n-p
-                            (format "Fileset %s does not exist. Create it? "
+                            (format "Fileset %s does not exist.  Create it?"
                                     name))
                        (progn
       (add-to-list 'filesets-data (list name '(:files)))
@@ -2198,8 +2199,9 @@ FS is a fileset's name.  FLIST is a list returned by
     nil))
 
 (defun filesets-build-dir-submenu (entry lookup-name dir patt)
-  "Build a :tree submenu named LOOKUP-NAME with base directory DIR including
-all files matching PATT for filesets ENTRY."
+  "Build a `:tree' submenu named LOOKUP-NAME.
+It has base directory DIR including all files matching PATT for
+filesets ENTRY."
   (let ((fd (filesets-entry-get-filter-dirs-flag entry))
        (depth (or (filesets-entry-get-tree-max-level entry)
                   filesets-tree-max-level)))
diff --git a/lisp/find-dired.el b/lisp/find-dired.el
index 87a7407a86..ebdb10ae9f 100644
--- a/lisp/find-dired.el
+++ b/lisp/find-dired.el
@@ -266,7 +266,7 @@ it finishes, type \\[kill-find]."
 
 ;;;###autoload
 (defun find-name-dired (dir pattern)
-  "Search DIR recursively for files matching the globbing pattern PATTERN,
+  "Search DIR recursively for files matching the globbing PATTERN,
 and run Dired on those files.
 PATTERN is a shell wildcard (not an Emacs regexp) and need not be quoted.
 The default command run (after changing into DIR) is
diff --git a/lisp/foldout.el b/lisp/foldout.el
index cadf2746ba..8925241df3 100644
--- a/lisp/foldout.el
+++ b/lisp/foldout.el
@@ -239,7 +239,7 @@ An end marker of nil means the fold ends after 
(point-max).")
 Normally the body and the immediate subheadings are exposed, but
 optional arg EXPOSURE \(interactively with prefix arg) changes this:-
 
-       EXPOSURE > 0    exposes n levels of subheadings (c.f. show-children)
+        EXPOSURE > 0   exposes n levels of subheadings (c.f. `show-children')
        EXPOSURE < 0    exposes only the body
        EXPOSURE = 0    exposes the entire subtree"
   (interactive "P")
diff --git a/lisp/font-core.el b/lisp/font-core.el
index db06a60766..95bf46c9b8 100644
--- a/lisp/font-core.el
+++ b/lisp/font-core.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 ;; This variable is used by mode packages that support Font Lock mode by
diff --git a/lisp/forms.el b/lisp/forms.el
index e1de011133..551a1ba3c9 100644
--- a/lisp/forms.el
+++ b/lisp/forms.el
@@ -1705,7 +1705,7 @@ As a side effect: re-calculates the number of records in 
the data file."
 ;;; Other commands
 
 (defun forms-toggle-read-only (arg)
-  "Toggles read-only mode of a forms mode buffer.
+  "Toggle read-only mode of a forms mode buffer.
 With an argument, enables read-only mode if the argument is positive.
 Otherwise enables edit mode if the visited file is writable."
 
@@ -1878,7 +1878,7 @@ after the current record."
   (setq forms--search-regexp regexp))
 
 (defun forms-save-buffer (&optional args)
-  "Forms mode replacement for save-buffer.
+  "Forms mode replacement for `save-buffer'.
 It saves the data buffer instead of the forms buffer.
 Calls `forms-write-file-filter' before, and `forms-read-file-filter'
 after writing out the data."
diff --git a/lisp/frame.el b/lisp/frame.el
index 60234fc2ae..e97b9903df 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -701,9 +701,8 @@ Return nil if we don't know how to interpret DISPLAY."
   "Make a frame on display DISPLAY.
 The optional argument PARAMETERS specifies additional frame parameters."
   (interactive (if (fboundp 'x-display-list)
-                   (list (completing-read
-                          (format "Make frame on display: ")
-                          (x-display-list)))
+                   (list (completing-read "Make frame on display: "
+                                          (x-display-list)))
                  (user-error "This Emacs build does not support X displays")))
   (make-frame (cons (cons 'display display) parameters)))
 
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index 7076dbedf2..7b6e15d6f8 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -4279,7 +4279,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
            (insert "Version: " (car items) "\n\n")
            (insert (mapconcat #'identity (cddr items) "\n"))
            (insert "\n-----END PGP SIGNATURE-----\n")
-           (let ((mm-security-handle (list (format "multipart/signed"))))
+           (let ((mm-security-handle (list (substring "multipart/signed"))))
              (mml2015-clean-buffer)
              (let ((coding-system-for-write (or gnus-newsgroup-charset
                                                 'iso-8859-1)))
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index bedae0f564..83c953515e 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -4398,8 +4398,7 @@ If FORCE, force saving whether it is necessary or not."
 (defun gnus-group-restart (&optional _arg)
   "Force Gnus to read the .newsrc file."
   (interactive nil gnus-group-mode)
-  (when (gnus-yes-or-no-p
-        (format "Are you sure you want to restart Gnus? "))
+  (when (gnus-yes-or-no-p "Are you sure you want to restart Gnus? ")
     (gnus-save-newsrc-file)
     (gnus-clear-system)
     (gnus)))
diff --git a/lisp/gnus/gnus-msg.el b/lisp/gnus/gnus-msg.el
index 66501ef7d5..8a3272042f 100644
--- a/lisp/gnus/gnus-msg.el
+++ b/lisp/gnus/gnus-msg.el
@@ -1303,15 +1303,9 @@ For the \"inline\" alternatives, also see the variable
 (defun gnus-summary-resend-message-insert-gcc ()
   "Insert Gcc header according to `gnus-gcc-self-resent-messages'."
   (gnus-inews-insert-gcc)
-  (let ((gcc (mapcar
-             (lambda (group)
-               (encode-coding-string
-                group
-                (gnus-group-name-charset (gnus-inews-group-method group)
-                                         group)))
-             (message-unquote-tokens
+  (let ((gcc (message-unquote-tokens
               (message-tokenize-header (mail-fetch-field "gcc" nil t)
-                                       " ,"))))
+                                       " ,")))
        (self (with-current-buffer gnus-summary-buffer
                gnus-gcc-self-resent-messages)))
     (message-remove-header "gcc")
@@ -1322,12 +1316,9 @@ For the \"inline\" alternatives, also see the variable
             (insert "Gcc: \"" gnus-newsgroup-name "\"\n"))
            ((stringp self)
             (insert "Gcc: "
-                    (encode-coding-string
-                     (if (string-search " " self)
-                         (concat "\"" self "\"")
-                       self)
-                     (gnus-group-name-charset (gnus-inews-group-method self)
-                                              self))
+                    (if (string-search " " self)
+                        (concat "\"" self "\"")
+                      self)
                     "\n"))
            ((null self)
             (insert "Gcc: " (mapconcat #'identity gcc ", ") "\n"))
@@ -1584,10 +1575,7 @@ this is a reply."
                        (message-tokenize-header gcc " ,\n\t")))
          ;; Copy the article over to some group(s).
          (while (setq group (pop groups))
-           (setq method (gnus-inews-group-method group)
-                 group (encode-coding-string
-                        group
-                        (gnus-group-name-charset method group)))
+           (setq method (gnus-inews-group-method group))
            (unless (gnus-check-server method)
              (error "Can't open server %s" (if (stringp method) method
                                              (car method))))
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el
index 7c983344de..f558360361 100644
--- a/lisp/gnus/gnus.el
+++ b/lisp/gnus/gnus.el
@@ -798,7 +798,7 @@ be used directly.")
               (goto-char (point-min))
                t)))
     (insert
-     (format "
+     "
          _    ___ _             _
          _ ___ __ ___  __    _ ___
          __   _     ___    __  ___
@@ -817,7 +817,7 @@ be used directly.")
            _
          __
 
-"))
+")
     ;; And then hack it.
     (gnus-indent-rigidly (point-min) (point-max)
                         (/ (max (- (window-width) (or x 46)) 0) 2))
diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el
index 82d1de25f3..aca4bf2062 100644
--- a/lisp/gnus/mm-decode.el
+++ b/lisp/gnus/mm-decode.el
@@ -1676,8 +1676,7 @@ If RECURSIVE, search recursively."
                    ((eq mm-decrypt-option 'never) nil)
                    ((eq mm-decrypt-option 'always) t)
                    ((eq mm-decrypt-option 'known) t)
-                   (t (y-or-n-p
-                       (format "Decrypt (S/MIME) part? "))))
+                   (t (y-or-n-p "Decrypt (S/MIME) part? ")))
                   (mm-view-pkcs7 parts from))
          (goto-char (point-min))
          ;; The encrypted document is a MIME part, and may use either
diff --git a/lisp/gnus/mm-uu.el b/lisp/gnus/mm-uu.el
index 9d4c4bfead..494221adee 100644
--- a/lisp/gnus/mm-uu.el
+++ b/lisp/gnus/mm-uu.el
@@ -511,7 +511,7 @@ apply the face `mm-uu-extract'."
       (list (mm-make-handle buf mm-uu-text-plain-type)))))
 
 (defun mm-uu-pgp-signed-extract ()
-  (let ((mm-security-handle (list (format "multipart/signed"))))
+  (let ((mm-security-handle (list (substring "multipart/signed"))))
     (mm-set-handle-multipart-parameter
      mm-security-handle 'protocol "application/x-gnus-pgp-signature")
     (save-restriction
@@ -579,7 +579,7 @@ apply the face `mm-uu-extract'."
        (list (mm-make-handle buf '("application/pgp-encrypted")))))))
 
 (defun mm-uu-pgp-encrypted-extract ()
-  (let ((mm-security-handle (list (format "multipart/encrypted"))))
+  (let ((mm-security-handle (list (substring "multipart/encrypted"))))
     (mm-set-handle-multipart-parameter
      mm-security-handle 'protocol "application/x-gnus-pgp-encrypted")
     (save-restriction
diff --git a/lisp/gnus/mm-view.el b/lisp/gnus/mm-view.el
index 2ec75a0bc5..129295474f 100644
--- a/lisp/gnus/mm-view.el
+++ b/lisp/gnus/mm-view.el
@@ -271,15 +271,17 @@ This is only used if `mm-inline-large-images' is set to
     (delete-region (match-beginning 0) (match-end 0))))
 
 (defun mm-inline-wash-with-file (post-func cmd &rest args)
-  (let ((file (make-temp-file
-              (expand-file-name "mm" mm-tmp-directory))))
-    (let ((coding-system-for-write 'binary))
-      (write-region (point-min) (point-max) file nil 'silent))
-    (delete-region (point-min) (point-max))
-    (unwind-protect
-       (apply #'call-process cmd nil t nil (mapcar (lambda (e) (eval e t)) 
args))
-      (delete-file file))
-    (and post-func (funcall post-func))))
+  (with-suppressed-warnings ((lexical file))
+    (dlet ((file (make-temp-file
+                 (expand-file-name "mm" mm-tmp-directory))))
+      (let ((coding-system-for-write 'binary))
+        (write-region (point-min) (point-max) file nil 'silent))
+      (delete-region (point-min) (point-max))
+      (unwind-protect
+         (apply #'call-process cmd nil t nil
+                 (mapcar (lambda (e) (eval e t)) args))
+        (delete-file file))
+      (and post-func (funcall post-func)))))
 
 (defun mm-inline-wash-with-stdin (post-func cmd &rest args)
   (let ((coding-system-for-write 'binary))
diff --git a/lisp/gnus/mml-smime.el b/lisp/gnus/mml-smime.el
index 959de0902e..b81dd2dae4 100644
--- a/lisp/gnus/mml-smime.el
+++ b/lisp/gnus/mml-smime.el
@@ -314,7 +314,6 @@ Whether the passphrase is cached at all is controlled by
 
 (defvar epg-user-id-alist)
 (defvar epg-digest-algorithm-alist)
-(defvar inhibit-redisplay)
 (defvar password-cache-expiry)
 
 (eval-when-compile
@@ -369,9 +368,7 @@ Content-Disposition: attachment; filename=smime.p7s
       (goto-char (point-max)))))
 
 (defun mml-smime-epg-encrypt (cont)
-  (let* ((inhibit-redisplay t)        ;FIXME: Why?
-        ;; (boundary (mml-compute-boundary cont))
-        (cipher (mml-secure-epg-encrypt 'CMS cont)))
+  (let* ((cipher (mml-secure-epg-encrypt 'CMS cont)))
     (delete-region (point-min) (point-max))
     (goto-char (point-min))
     (insert "\
@@ -387,8 +384,7 @@ Content-Disposition: attachment; filename=smime.p7m
 
 (defun mml-smime-epg-verify (handle ctl)
   (catch 'error
-    (let ((inhibit-redisplay t)
-         context part signature) ;; plain signature-file
+    (let (context part signature) ;; plain signature-file
       (when (or (null (setq part (mm-find-raw-part-by-type
                                  ctl (or (mm-handle-multipart-ctl-parameter
                                           ctl 'protocol)
diff --git a/lisp/gnus/mml1991.el b/lisp/gnus/mml1991.el
index 05f44a1cbd..55ef9cf7b3 100644
--- a/lisp/gnus/mml1991.el
+++ b/lisp/gnus/mml1991.el
@@ -259,8 +259,7 @@ Whether the passphrase is cached at all is controlled by
 (autoload 'epg-expand-group "epg-config")
 
 (defun mml1991-epg-sign (_cont)
-  (let ((inhibit-redisplay t)
-       headers cte)
+  (let (headers cte)
     ;; Don't sign headers.
     (goto-char (point-min))
     (when (re-search-forward "^$" nil t)
diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el
index 8c40fc79f0..239738114b 100644
--- a/lisp/gnus/mml2015.el
+++ b/lisp/gnus/mml2015.el
@@ -700,7 +700,6 @@ If set, it overrides the setting of 
`mml2015-sign-with-sender'."
 (defvar epg-user-id-alist)
 (defvar epg-digest-algorithm-alist)
 (defvar epg-gpg-program)
-(defvar inhibit-redisplay)
 
 (autoload 'epg-make-context "epg")
 (autoload 'epg-context-set-armor "epg")
@@ -773,8 +772,7 @@ If set, it overrides the setting of 
`mml2015-sign-with-sender'."
 
 (defun mml2015-epg-decrypt (handle _ctl)
   (catch 'error
-    (let ((inhibit-redisplay t)
-         context plain child handles) ;; decrypt-status result
+    (let (context plain child handles) ;; decrypt-status result
       (unless (setq child (mm-find-part-by-type
                           (cdr handle)
                           "application/octet-stream" nil t))
@@ -818,8 +816,7 @@ If set, it overrides the setting of 
`mml2015-sign-with-sender'."
          (list handles)))))
 
 (defun mml2015-epg-clear-decrypt ()
-  (let ((inhibit-redisplay t)
-       (context (epg-make-context))
+  (let ((context (epg-make-context))
        plain)
     (if (or mml2015-cache-passphrase mml-secure-cache-passphrase)
        (epg-context-set-passphrase-callback
@@ -851,8 +848,7 @@ If set, it overrides the setting of 
`mml2015-sign-with-sender'."
 
 (defun mml2015-epg-verify (handle ctl)
   (catch 'error
-    (let ((inhibit-redisplay t)
-         context part signature) ;; plain signature-file
+    (let (context part signature) ;; plain signature-file
       (when (or (null (setq part (mm-find-raw-part-by-type
                                  ctl (or (mm-handle-multipart-ctl-parameter
                                           ctl 'protocol)
@@ -881,8 +877,7 @@ If set, it overrides the setting of 
`mml2015-sign-with-sender'."
       handle)))
 
 (defun mml2015-epg-clear-verify ()
-  (let ((inhibit-redisplay t)
-       (context (epg-make-context))
+  (let ((context (epg-make-context))
        (signature (encode-coding-string (buffer-string)
                                         coding-system-for-write))
        plain)
@@ -904,8 +899,7 @@ If set, it overrides the setting of 
`mml2015-sign-with-sender'."
       (mml2015-extract-cleartext-signature))))
 
 (defun mml2015-epg-sign (cont)
-  (let ((inhibit-redisplay t)
-       (boundary (mml-compute-boundary cont)))
+  (let ((boundary (mml-compute-boundary cont)))
     ;; Signed data must end with a newline (RFC 3156, 5).
     (goto-char (point-max))
     (unless (bolp)
@@ -934,8 +928,7 @@ If set, it overrides the setting of 
`mml2015-sign-with-sender'."
       (goto-char (point-max)))))
 
 (defun mml2015-epg-encrypt (cont &optional sign)
-  (let* ((inhibit-redisplay t)
-        (boundary (mml-compute-boundary cont))
+  (let* ((boundary (mml-compute-boundary cont))
         (cipher (mml-secure-epg-encrypt 'OpenPGP cont sign)))
     (delete-region (point-min) (point-max))
     (goto-char (point-min))
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index ffbead3398..6be5cd4a50 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -132,6 +132,12 @@ with the current prefix.  The files are chosen according to
   :group 'help
   :version "26.3")
 
+(defcustom help-enable-symbol-autoload nil
+  "Perform autoload if docs are missing from autoload objects."
+  :type 'boolean
+  :group 'help
+  :version "28.1")
+
 (defun help--symbol-class (s)
   "Return symbol class characters for symbol S."
   (when (stringp s)
@@ -227,7 +233,10 @@ interactive command."
 ;;;###autoload
 (defun describe-function (function)
   "Display the full documentation of FUNCTION (a symbol).
-When called from Lisp, FUNCTION may also be a function object."
+When called from Lisp, FUNCTION may also be a function object.
+
+See the `help-enable-symbol-autoload' variable for special
+handling of autoloaded functions."
   (interactive (help-fns--describe-function-or-command-prompt))
 
   ;; We save describe-function-orig-buffer on the help xref stack, so
@@ -823,6 +832,16 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED 
REAL-DEF)."
                        f))
                    ((subrp def) (intern (subr-name def)))
                     (t def))))
+
+    ;; If we don't have a doc string, then try to load the file.
+    (when (and help-enable-symbol-autoload
+               (autoloadp real-def)
+               ;; Empty documentation slot.
+               (not (nth 2 real-def)))
+      (condition-case err
+          (autoload-do-load real-def)
+        (error (message "Error while autoloading: %S" err))))
+
     (list real-function def aliased real-def)))
 
 (defun help-fns-function-description-header (function)
@@ -1162,7 +1181,7 @@ it is displayed along with the global value."
                 (princ (format "Local in buffer %s; "
                                (buffer-name buffer))))
                ((terminal-live-p locus)
-                (princ (format "It is a terminal-local variable; ")))
+                (princ "It is a terminal-local variable; "))
                (t
                 (princ (format "It is local to %S" locus))))
              (if (not (default-boundp variable))
diff --git a/lisp/help.el b/lisp/help.el
index 29ae340481..8f77167040 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -597,7 +597,7 @@ or a buffer name."
           (let ((inhibit-read-only t))
             (goto-char (point-min))
             (insert (substitute-command-keys
-                     (concat "\\<outline-mode-cycle-map>Type "
+                     (concat "\\<outline-minor-mode-cycle-map>Type "
                              "\\[outline-cycle] or \\[outline-cycle-buffer] "
                              "on headings to cycle their visibility.\n\n")))
             ;; Hide the longest body
diff --git a/lisp/hexl.el b/lisp/hexl.el
index 4a7bf9479a..79dd5c40c6 100644
--- a/lisp/hexl.el
+++ b/lisp/hexl.el
@@ -1165,7 +1165,7 @@ This function is assumed to be used as callback function 
for `hl-line-mode'."
 
 ;; startup stuff.
 
-(easy-menu-define hexl-menu hexl-mode-map "Hexl Mode menu"
+(easy-menu-define hexl-menu hexl-mode-map "Hexl Mode menu."
   '("Hexl"
     :help "Hexl-specific Features"
 
diff --git a/lisp/hi-lock.el b/lisp/hi-lock.el
index 4c924e9d52..7d126cb558 100644
--- a/lisp/hi-lock.el
+++ b/lisp/hi-lock.el
@@ -244,7 +244,7 @@ by cycling through the faces in `hi-lock-face-defaults'."
   "String used to identify hi-lock patterns at the start of files.")
 
 (defvar hi-lock-archaic-interface-message-used nil
-  "True if user alerted that `global-hi-lock-mode' is now the global switch.
+  "Non-nil if user alerted that `global-hi-lock-mode' is now the global switch.
 Earlier versions of hi-lock used `hi-lock-mode' as the global switch;
 the message is issued if it appears that `hi-lock-mode' is used assuming
 that older functionality.  This variable avoids multiple reminders.")
diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el
index e63910d857..9fe6e825f7 100644
--- a/lisp/htmlfontify.el
+++ b/lisp/htmlfontify.el
@@ -90,23 +90,30 @@
   "The generator meta tag for this version of htmlfontify.")
 
 (defconst htmlfontify-manual "Htmlfontify Manual"
-  "Copy and convert buffers and files to HTML, adding hyperlinks between files
-\(driven by etags) if requested.
-\nInteractive functions:
+  "Copy and convert buffers and files to HTML.
+Add hyperlinks between files driven by etags) if requested.
+
+Interactive functions:
   `htmlfontify-buffer'
   `htmlfontify-run-etags'
   `htmlfontify-copy-and-link-dir'
   `htmlfontify-load-rgb-file'
-  `htmlfontify-unload-rgb-file'\n
-In order to:\n
+  `htmlfontify-unload-rgb-file'
+
+In order to:
+
 fontify a file you have open:           \\[htmlfontify-buffer]
 prepare the etags map for a directory:  \\[htmlfontify-run-etags]
-copy a directory, fontifying as you go: \\[htmlfontify-copy-and-link-dir]\n
+copy a directory, fontifying as you go: \\[htmlfontify-copy-and-link-dir]
+
 The following might be useful when running non-windowed or in batch mode:
-\(note that they shouldn't be necessary - we have a built in map)\n
+\(note that they shouldn't be necessary - we have a built in map)
+
 load an X11 style rgb.txt file:         \\[htmlfontify-load-rgb-file]
-unload the current rgb.txt file:        \\[htmlfontify-unload-rgb-file]\n
-And here's a programmatic example:\n
+unload the current rgb.txt file:        \\[htmlfontify-unload-rgb-file]
+
+And here's a programmatic example:
+
 \(defun rtfm-build-page-header (file style)
   (format \"#define  TEMPLATE red+black.html
 #define  DEBUG    1
@@ -148,7 +155,8 @@ This is called with two arguments (the filename relative to 
the top
 level source directory being etag'd and fontified), and a string containing
 the <style>...</style> text to embed in the document.
 It should return a string that will be used as the header for the
-htmlfontified version of the source file.\n
+htmlfontified version of the source file.
+
 See also `hfy-page-footer'."
   ;; FIXME: Why place such a :tag everywhere?  Isn't it imposing your
   ;; own Custom preference on your users?  --Stef
@@ -233,8 +241,10 @@ These functions will be called with the HTML buffer as the 
current buffer."
   "Fallback `defface' specification for the face `default', used when
 `hfy-display-class' has been set (the normal htmlfontify way of extracting
 potentially non-current face information doesn't necessarily work for
-`default').\n
-Example: I customize this to:\n
+`default').
+
+Example: I customize this to:
+
 \((t :background \"black\" :foreground \"white\" :family \"misc-fixed\"))"
   :tag     "default-face-definition"
   :type    '(alist))
@@ -244,8 +254,9 @@ Example: I customize this to:\n
                                   "\x01" "\\([0-9]+\\)"
                                   ","    "\\([0-9]+\\)$"
                                   "\\|"  ".*\x7f[0-9]+,[0-9]+$")
-  "Regex used to parse an etags entry: must have 3 subexps, corresponding,
-in order, to:\n
+  "Regex used to parse an etags entry.
+This must have 3 subexps, corresponding, in order, to:
+
    1 - The tag
    2 - The line
    3 - The char (point) at which the tag occurs."
@@ -302,7 +313,8 @@ done;")
   :type  '(alist :key-type (string) :value-type (string)))
 
 (defcustom hfy-etags-bin "etags"
-  "Location of etags binary (we begin by assuming it's in your path).\n
+  "Location of etags binary (we begin by assuming it's in your path).
+
 Note that if etags is not in your path, you will need to alter the shell
 commands in `hfy-etags-cmd-alist'."
   :tag   "etags-bin"
@@ -346,7 +358,8 @@ commands in `hfy-etags-cmd-alist'."
   (cdr (assoc (hfy-which-etags) hfy-etags-cmd-alist))
   "The etags equivalent command to run in a source directory to generate a tags
 file for the whole source tree from there on down.  The command should emit
-the etags output on stdout.\n
+the etags output on stdout.
+
 Two canned commands are provided - they drive Emacs's etags and
 exuberant-ctags' etags respectively."
   :tag   "etags-command"
@@ -356,9 +369,10 @@ exuberant-ctags' etags respectively."
           (cons 'choice clist)))
 
 (defcustom hfy-istext-command "file %s | sed -e 's@^[^:]*:[ \t]*@@'"
-  "Command to run with the name of a file, to see whether it is a text file
-or not.  The command should emit a string containing the word `text' if
-the file is a text file, and a string not containing `text' otherwise."
+  "Command to run with the name of a file, to see if it is a text file or not.
+The command should emit a string containing the word `text' if
+the file is a text file, and a string not containing `text'
+otherwise."
   :tag   "istext-command"
   :type  '(string))
 
@@ -372,8 +386,10 @@ the file is a text file, and a string not containing 
`text' otherwise."
   "Display class to use to determine which display class to use when
 calculating a face's attributes.  This is useful when, for example, you
 are running Emacs on a tty or in batch mode, and want htmlfontify to have
-access to the face spec you would use if you were connected to an X display.\n
-Some valid class specification elements are:\n
+access to the face spec you would use if you were connected to an X display.
+
+Some valid class specification elements are:
+
   (class      color)
   (class      grayscale)
   (background dark)
@@ -383,14 +399,17 @@ Some valid class specification elements are:\n
   (type       motif)
   (type       lucid)
 Multiple values for a tag may be combined, to indicate that any one or more
-of these values in the specification key constitutes a match, eg:\n
-\((class color grayscale) (type tty)) would match any of:\n
+of these values in the specification key constitutes a match, eg:
+
+\((class color grayscale) (type tty)) would match any of:
+
   ((class color))
   ((class grayscale))
   ((class color grayscale))
   ((class color foo))
   ((type  tty))
-  ((type  tty) (class color))\n
+  ((type  tty) (class color))
+
 and so on."
   :type    '(alist :key-type (symbol) :value-type (symbol))
   :tag     "display-class"
@@ -407,7 +426,9 @@ and so on."
 
 (define-obsolete-variable-alias 'hfy-optimisations 'hfy-optimizations "25.1")
 (defcustom hfy-optimizations (list 'keep-overlays)
-  "Optimizations to turn on: So far, the following have been implemented:\n
+  "Optimizations to turn on.
+So far, the following have been implemented:
+
   merge-adjacent-tags: If two (or more) span tags are adjacent, identical and
                        separated by nothing more than whitespace, they will
                        be merged into one span.
@@ -417,16 +438,19 @@ and so on."
                        output.
   keep-overlays      : More of a bell (or possibly whistle) than an
                        optimization - If on, preserve overlay highlighting
-                       (cf ediff or goo-font-lock) as well as basic faces.\n
+                       (cf ediff or goo-font-lock) as well as basic faces.
+
   body-text-only     : Emit only body-text.  In concrete terms,
                        1. Suppress calls to `hfy-page-header' and
                           `hfy-page-footer'
                        2. Pretend that `div-wrapper' option above is
                           turned off
                        3. Don't enclose output in <pre> </pre> tags
-  And the following are planned but not yet available:\n
+  And the following are planned but not yet available:
+
   kill-context-leak  : Suppress hyperlinking between files highlighted by
-                       different modes.\n
+                       different modes.
+
 Note: like compiler optimizations, these optimize the _output_ of the code,
 not the processing of the source itself, and are therefore likely to slow
 htmlfontify down, at least a little.  Except for skip-refontification,
@@ -442,20 +466,28 @@ which can never slow you down, but may result in 
incomplete fontification."
   :tag   "optimizations")
 
 (defvar hfy-tags-cache nil
-  "Alist of the form:\n
-\((\"/src/dir/0\" . tag-hash0) (\"/src/dir/1\" tag-hash1) ...)\n
-Each tag hash entry then contains entries of the form:\n
-\"tag_string\" => ((\"file/name.ext\" line char) ... )\n
-ie an alist mapping (relative) file paths to line and character offsets.\n
+  "Alist of the form:
+
+\((\"/src/dir/0\" . tag-hash0) (\"/src/dir/1\" tag-hash1) ...)
+
+Each tag hash entry then contains entries of the form:
+
+\"tag_string\" => ((\"file/name.ext\" line char) ... )
+
+ie an alist mapping (relative) file paths to line and character offsets.
+
 See also `hfy-load-tags-cache'.")
 
 (defvar hfy-tags-sortl nil
-  "Alist of the form ((\"/src/dir\" . (tag0 tag1 tag2)) ... )\n
-where the tags are stored in descending order of length.\n
+  "Alist of the form ((\"/src/dir\" . (tag0 tag1 tag2)) ... )
+
+where the tags are stored in descending order of length.
+
 See also `hfy-load-tags-cache'.")
 
 (defvar hfy-tags-rmap nil
-  "Alist of the form ((\"/src/dir\" . tag-rmap-hash))\n
+  "Alist of the form ((\"/src/dir\" . tag-rmap-hash))
+
 where tag-rmap-hash has entries of the form:
 \"tag_string\" => ( \"file/name.ext\" line char )
 Unlike `hfy-tags-cache' these are the locations of occurrences of
@@ -467,8 +499,10 @@ Properties may be repeated, in which case later properties 
should be
 treated as if they were inherited from a `parent' font.
 \(For some properties, only the first encountered value is of any importance,
 for others the values might be cumulative, and for others they might be
-cumulative in a complex way.)\n
-Some examples:\n
+cumulative in a complex way.)
+
+Some examples:
+
 \(hfy-face-to-style \\='default) =>
   ((\"background\"      . \"rgb(0, 0, 0)\")
    (\"color\"           . \"rgb(255, 255, 255)\")
@@ -477,27 +511,31 @@ Some examples:\n
    (\"font-stretch\"    . \"normal\")
    (\"font-family\"     . \"misc-fixed\")
    (\"font-size\"       . \"13pt\")
-   (\"text-decoration\" . \"none\"))\n
+   (\"text-decoration\" . \"none\"))
+
 \(hfy-face-to-style \\='Info-title-3-face) =>
   ((\"font-weight\"     . \"700\")
    (\"font-family\"     . \"helv\")
    (\"font-size\"       . \"120%\")
-   (\"text-decoration\" . \"none\"))\n")
+   (\"text-decoration\" . \"none\"))")
 
 (defvar hfy-sheet-assoc 'please-ignore-this-line
-  "An assoc with elements of the form (face-name style-name . style-string):\n
+  "An assoc with elements of the form (face-name style-name . style-string):
+
 \((default               \"default\" . \"{background: black; color: white}\")
  (font-lock-string-face \"string\"  . \"{color: rgb(64,224,208)}\"))" )
 
 (defvar hfy-facemap-assoc 'please-ignore-this-line
   "An assoc of (point . FACE-SYMBOL) or (point . DEFFACE-LIST)
 and (point . \\='end) elements, in descending order of point value
-\(ie from the file's end to its beginning).\n
+\(ie from the file's end to its beginning).
+
 The map is in reverse order because inserting a <style> tag (or any other
 string) at `point' invalidates the map for all entries with a greater value of
 point.  By traversing the map from greatest to least point, we still invalidate
 the map as we go, but only those points we have already dealt with (and
-therefore no longer care about) will be invalid at any time.\n
+therefore no longer care about) will be invalid at any time.
+
 \\='((64820 . end)
   (64744 . font-lock-comment-face)
   (64736 . end)
@@ -529,8 +567,9 @@ therefore no longer care about) will be invalid at any 
time.\n
       (group xdigit xdigit)))
 
 (defun hfy-color-vals (color)
-  "Where COLOR is a color name or #XXXXXX style triplet, return a
-list of three (16 bit) rgb values for said color.\n
+  "Return a list of three (16 bit) rgb values for COLOR.
+COLOR is a color name or #XXXXXX style triplet.
+
 If a window system is unavailable, calls `hfy-fallback-color-values'."
   (if (string-match hfy-triplet-regex color)
       (mapcar
@@ -826,16 +865,20 @@ precedence."
   "Return the face attributes for FACE.
 If CLASS is set, it must be a `defface' alist key [see below],
 in which case the first face specification returned by `hfy-combined-face-spec'
-which *doesn't* clash with CLASS is returned.\n
+which *doesn't* clash with CLASS is returned.
+
 \(A specification with a class of t is considered to match any class you
 specify - this matches Emacs's behavior when deciding on which face attributes
-to use, to the best of my understanding).\n
+to use, to the best of my understanding).
+
 If CLASS is nil, then you just get whatever `face-attr-construct' returns,
-ie the current specification in effect for FACE.\n
+ie the current specification in effect for FACE.
+
 *NOTE*: This function forces any face that is not `default' and which has
 no :inherit property to inherit from `default' (this is because `default'
 is magical in that Emacs's fonts behave as if they inherit implicitly from
-`default', but no such behavior exists in HTML/CSS).\n
+`default', but no such behavior exists in HTML/CSS).
+
 See also `hfy-display-class' for details of valid values for CLASS."
   (let ((face-spec
          (if class
@@ -924,12 +967,13 @@ See also `hfy-display-class' for details of valid values 
for CLASS."
 ;;    nil :overline nil :underline nil :slant normal :weight normal
 ;;    :height 98 :width normal :family "outline-courier new")
 (defun hfy-face-to-style-i (fn)
-  "The guts of `hfy-face-to-style': FN should be a `defface' font spec,
-as returned by `face-attr-construct' or `hfy-face-attr-for-class'.
-Note that this function does not get font-sizes right if they are based
-on inherited modifiers (via the :inherit) attribute, and any other
-modifiers that are cumulative if they appear multiple times need to be
-merged by the user - `hfy-flatten-style' should do this."
+  "The guts of `hfy-face-to-style'.
+FN should be a `defface' font spec, as returned by
+`face-attr-construct' or `hfy-face-attr-for-class'.  Note that
+this function does not get font-sizes right if they are based on
+inherited modifiers (via the :inherit) attribute, and any other
+modifiers that are cumulative if they appear multiple times need
+to be merged by the user - `hfy-flatten-style' should do this."
   ;;(message "hfy-face-to-style-i");;DBUG
 
   ;; fn's value could be something like
@@ -990,10 +1034,13 @@ Used while merging multiple font-size attributes."
 ;; we have to trawl the inheritance path, accumulating modifiers,
 ;; _until_ we get to an absolute (pt) specifier, then combine the lot
 (defun hfy-flatten-style (style)
-  "Take STYLE (see `hfy-face-to-style-i', `hfy-face-to-style') and merge
-any multiple attributes appropriately.  Currently only font-size is merged
-down to a single occurrence - others may need special handling, but I
-haven't encountered them yet.  Returns a `hfy-style-assoc'."
+  "Take STYLE and merge any multiple attributes appropriately.
+For the format of STYLE, see `hfy-face-to-style-i' and
+`hfy-face-to-style'.  Return a `hfy-style-assoc'.
+
+Currently only font-size is merged down to a single occurrence -
+others may need special handling, but I haven't encountered them
+yet."
   ;;(message "(hfy-flatten-style %S)" style) ;;DBUG
   (let ((m (list 1))
         (x      nil)
@@ -1027,7 +1074,8 @@ then the specification is returned unchanged."
 (defun hfy-face-to-style (fn)
   "Take FN, a font or `defface' style font specification,
 \(as returned by `face-attr-construct' or `hfy-face-attr-for-class')
-and return a `hfy-style-assoc'.\n
+and return a `hfy-style-assoc'.
+
 See also `hfy-face-to-style-i', `hfy-flatten-style'."
   ;;(message "hfy-face-to-style");;DBUG
   (let* ((face-def (hfy-face-resolve-face fn))
@@ -1341,10 +1389,14 @@ variable `font-lock-mode' and variable 
`font-lock-fontified' for truth."
 (defun hfy-merge-adjacent-spans (face-map)
   "Where FACE-MAP is a `hfy-facemap-assoc' for the current buffer,
 this function merges adjacent style blocks which are of the same value
-and are separated by nothing more interesting than whitespace.\n
-  <span class=\"foo\">narf</span> <span class=\"foo\">brain</span>\n
-\(as interpreted from FACE-MAP) would become:\n
-  <span class=\"foo\">narf brain</span>\n
+and are separated by nothing more interesting than whitespace.
+
+  <span class=\"foo\">narf</span> <span class=\"foo\">brain</span>
+
+\(as interpreted from FACE-MAP) would become:
+
+  <span class=\"foo\">narf brain</span>
+
 Returns a modified copy of FACE-MAP."
   (let ((tmp-map face-map)
         (map-buf      nil)
@@ -1467,7 +1519,8 @@ Uses `hfy-link-style-fun' to do this."
 ;; tag all the dangerous characters we want to escape
 ;; (ie any "<> chars we _didn't_ put there explicitly for css markup)
 (defun hfy-html-enkludge-buffer ()
-  "Mark dangerous [\"<>] characters with the `hfy-quoteme' property.\n
+  "Mark dangerous [\"<>] characters with the `hfy-quoteme' property.
+
 See also `hfy-html-dekludge-buffer'."
   ;;(message "hfy-html-enkludge-buffer");;DBUG
   (save-excursion
@@ -1488,7 +1541,8 @@ See also `hfy-html-dekludge-buffer'."
 ;; map of offsets, which would be tedious...
 (defun hfy-html-dekludge-buffer ()
   "Transform all dangerous characters marked with the `hfy-quoteme' property
-using `hfy-html-quote'.\n
+using `hfy-html-quote'.
+
 See also `hfy-html-enkludge-buffer'."
   ;;(message "hfy-html-dekludge-buffer");;DBUG
   (save-excursion
@@ -1820,14 +1874,14 @@ Hardly bombproof, but good enough in the context in 
which it is being used."
 
 ;; create a directory, cf mkdir -p
 (defun hfy-make-directory (dir)
-  "Approx. equivalent of mkdir -p DIR."
+  "Approximate equivalent of \"mkdir -p DIR\"."
   ;;(message "hfy-make-directory");;DBUG
   (if (file-exists-p dir)
       (if (file-directory-p dir) t)
     (make-directory dir t)))
 
 (defun hfy-text-p (srcdir file)
-  "Is SRCDIR/FILE text?  Uses `hfy-istext-command' to determine this."
+  "Is SRCDIR/FILE text?  Use `hfy-istext-command' to determine this."
   (let* ((cmd (format hfy-istext-command (expand-file-name file srcdir)))
          (rsp (shell-command-to-string    cmd)))
     (string-match "text" rsp)))
@@ -1910,12 +1964,15 @@ START is the offset at which to start looking for the / 
character in FILE."
   "Return an href stub for a tag href in THIS-FILE.
 If DEF-FILES (list of files containing definitions for the tag in question)
 contains only one entry, the href should link straight to that file.
-Otherwise, the link should be to the index file.\n
+Otherwise, the link should be to the index file.
+
 We are not yet concerned with the file extensions/tag line number and so on at
-this point.\n
+this point.
+
 If `hfy-split-index' is set, and the href wil be to an index file rather than
 a source file, append a .X to `hfy-index-file', where X is the uppercased
-first character of TAG.\n
+first character of TAG.
+
 See also `hfy-relstub', `hfy-index-file'."
   ;;(message "hfy-href-stub");;DBUG
   ;; FIXME: Why not use something like
@@ -1927,8 +1984,10 @@ See also `hfy-relstub', `hfy-index-file'."
        (concat hfy-index-file "." (upcase (substring tag 0 1)))))) )
 
 (defun hfy-href (this-file def-files tag tag-map)
-  "Return a relative href to the tag in question, based on\n
-THIS-FILE `hfy-link-extn' `hfy-extn' DEF-FILES TAG and TAG-MAP\n
+  "Return a relative href to the tag in question, based on
+
+THIS-FILE `hfy-link-extn' `hfy-extn' DEF-FILES TAG and TAG-MAP
+
 THIS-FILE is the current source file
 DEF-FILES is a list of file containing possible link endpoints for TAG
 TAG is the tag in question
@@ -1949,8 +2008,10 @@ word characters on either side."
 ;; mark all tags for hyperlinking, except the tags at
 ;; their own points of definition, iyswim:
 (defun hfy-mark-tag-hrefs (srcdir file)
-  "Mark href start points with the `hfy-link' prop (value: href string).\n
-Mark href end points with the `hfy-endl' prop (value t).\n
+  "Mark href start points with the `hfy-link' prop (value: href string).
+
+Mark href end points with the `hfy-endl' prop (value t).
+
 Avoid overlapping links, and mark links in descending length of
 tag name in order to prevent subtags from usurping supertags,
 \(eg \"term\" for \"terminal\").
@@ -2107,9 +2168,11 @@ FILE is the specific file we are rendering."
   "Prepare a tags index buffer for SRCDIR.
 `hfy-tags-cache' must already have an entry for SRCDIR for this to work.
 `hfy-page-header', `hfy-page-footer', `hfy-link-extn' and `hfy-extn'
-all play a part here.\n
+all play a part here.
+
 If STUB is set, prepare an (appropriately named) index buffer
-specifically for entries beginning with STUB.\n
+specifically for entries beginning with STUB.
+
 If MAP is set, use that instead of `hfy-tags-cache'.
 FILENAME is the name of the file being indexed.
 DSTDIR is the output directory, where files will be written."
@@ -2185,7 +2248,8 @@ SRCDIR and DSTDIR are the source and output directories 
respectively."
 (defun hfy-prepare-tag-map (srcdir dstdir)
   "Prepare the counterpart(s) to the index buffer(s) - a list of buffers
 with the same structure, but listing (and linking to) instances of tags
-\(as opposed to their definitions).\n
+\(as opposed to their definitions).
+
 SRCDIR and DSTDIR are the source and output directories respectively.
 See also `hfy-prepare-index', `hfy-split-index'."
   (if (not hfy-split-index)
@@ -2257,7 +2321,8 @@ See also `hfy-load-tags-cache'."
 ;;;###autoload
 (defun htmlfontify-copy-and-link-dir (srcdir dstdir &optional f-ext l-ext)
   "Trawl SRCDIR and write fontified-and-hyperlinked output in DSTDIR.
-F-EXT and L-EXT specify values for `hfy-extn' and `hfy-link-extn'.\n
+F-EXT and L-EXT specify values for `hfy-extn' and `hfy-link-extn'.
+
 You may also want to set `hfy-page-header' and `hfy-page-footer'."
   (interactive "D source directory: \nD output directory: ")
   ;;(message "htmlfontify-copy-and-link-dir")
@@ -2297,9 +2362,7 @@ You may also want to set `hfy-page-header' and 
`hfy-page-footer'."
 ;;   (and (string-match "-hook\\'" (symbol-name H))
 ;;        (boundp H)
 ;;        (symbol-value H)
-;;        (insert (format "\n '(%S %S)" H (symbol-value H)))
-;;        )
-;;   )
+;;        (insert (format "\n '(%S %S)" H (symbol-value H)))))
 
 ;; (defun hfy-save-hooks ()
 ;;   (let ((custom-file (hfy-initfile)))
@@ -2307,10 +2370,7 @@ You may also want to set `hfy-page-header' and 
`hfy-page-footer'."
 ;;     (let ((standard-output (current-buffer)))
 ;;       (princ "(hfy-set-hooks\n;;auto-generated, only one copy allowed\n")
 ;;       (mapatoms #'hfy-pp-hook)
-;;       (insert "\n)")
-;;       )
-;;     )
-;;   )
+;;       (insert "\n)"))))
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defalias 'hfy-init-progn 'progn)
diff --git a/lisp/image-dired.el b/lisp/image-dired.el
index b92a9371ec..3ca47300a9 100644
--- a/lisp/image-dired.el
+++ b/lisp/image-dired.el
@@ -519,7 +519,7 @@ Used by `image-dired-copy-with-exif-file-name'."
 
 (defcustom image-dired-show-all-from-dir-max-files 50
   "Maximum number of files to show using `image-dired-show-all-from-dir'
-before warning the user."
+before warning."
   :type 'integer)
 
 (defmacro image-dired--with-db-file (&rest body)
@@ -1958,7 +1958,7 @@ With prefix argument ARG, display image in its original 
size."
   (image-dired-display-image (dired-get-filename) arg))
 
 (defun image-dired-image-at-point-p ()
-  "Return true if there is an image-dired thumbnail at point."
+  "Return non-nil if there is an `image-dired' thumbnail at point."
   (get-text-property (point) 'image-dired-thumbnail))
 
 (defun image-dired-rotate-thumbnail (degrees)
diff --git a/lisp/imenu.el b/lisp/imenu.el
index 788755a2d7..22412d5f88 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -829,8 +829,7 @@ A trivial interface to `imenu-add-to-menubar' suitable for 
use in a hook."
 (defvar imenu-buffer-menubar nil)
 
 (defvar-local imenu-menubar-modified-tick 0
-  "The value of (buffer-chars-modified-tick) as of the last call
-to `imenu-update-menubar'.")
+  "Value of (buffer-chars-modified-tick) when `imenu-update-menubar' was 
called.")
 
 (defun imenu-update-menubar ()
   (when (and (current-local-map)
diff --git a/lisp/indent.el b/lisp/indent.el
index aa2bfbceeb..aa6b8d17c4 100644
--- a/lisp/indent.el
+++ b/lisp/indent.el
@@ -463,7 +463,7 @@ Optional fifth argument OBJECT specifies the string or 
buffer to operate on."
        (put-text-property begin to prop (funcall func val) object))))
 
 (defun increase-left-margin (from to inc)
-  "Increase or decrease the left-margin of the region.
+  "Increase or decrease the `left-margin' of the region.
 With no prefix argument, this adds `standard-indent' of indentation.
 A prefix arg (optional third arg INC noninteractively) specifies the amount
 to change the margin by, in characters.
@@ -520,11 +520,14 @@ If `auto-fill-mode' is active, re-fills region to fit in 
new margin."
 
 (defun beginning-of-line-text (&optional n)
   "Move to the beginning of the text on this line.
-With optional argument, move forward N-1 lines first.
-From the beginning of the line, moves past the left-margin indentation, the
-fill-prefix, and any indentation used for centering or right-justifying the
-line, but does not move past any whitespace that was explicitly inserted
-\(such as a tab used to indent the first line of a paragraph)."
+
+With optional argument N, move forward N-1 lines first.
+
+From the beginning of the line, moves past the `left-margin'
+indentation, the `fill-prefix', and any indentation used for
+centering or right-justifying the line, but does not move past
+any whitespace that was explicitly inserted (such as a tab used
+to indent the first line of a paragraph)."
   (interactive "^p")
   (beginning-of-line n)
   (skip-chars-forward " \t")
diff --git a/lisp/info-look.el b/lisp/info-look.el
index 33f15a34e9..7cc5462dd4 100644
--- a/lisp/info-look.el
+++ b/lisp/info-look.el
@@ -262,7 +262,8 @@ system."
 (defun info-lookup-symbol (symbol &optional mode)
   "Display the definition of SYMBOL, as found in the relevant manual.
 When this command is called interactively, it reads SYMBOL from the
-minibuffer.  In the minibuffer, use M-n to yank the default argument
+minibuffer.  In the minibuffer, use \\<minibuffer-local-completion-map>\
+\\[next-history-element] to yank the default argument
 value into the minibuffer so you can edit it.  The default symbol is the
 one found at point.
 
@@ -276,7 +277,8 @@ With prefix arg MODE a query for the symbol help mode is 
offered."
 (defun info-lookup-file (file &optional mode)
   "Display the documentation of a file.
 When this command is called interactively, it reads FILE from the minibuffer.
-In the minibuffer, use M-n to yank the default file name
+In the minibuffer, use \\<minibuffer-local-completion-map>\
+\\[next-history-element] to yank the default file name
 into the minibuffer so you can edit it.
 The default file name is the one found at point.
 
diff --git a/lisp/international/ccl.el b/lisp/international/ccl.el
index 0eb009fa52..9be4d1ee95 100644
--- a/lisp/international/ccl.el
+++ b/lisp/international/ccl.el
@@ -213,8 +213,7 @@ proper index number for SYMBOL.  PROP should be
   (ccl-embed-data (cons symbol prop)))
 
 (defun ccl-embed-string (len str)
-  "Embed string STR of length LEN in `ccl-program-vector' at
-`ccl-current-ic'."
+  "Embed string STR of length LEN in `ccl-program-vector' at `ccl-current-ic'."
   (if (> len #xFFFFF)
       (error "CCL: String too long: %d" len))
   (if (> (string-bytes str) len)
@@ -282,8 +281,7 @@ changed to a relative jump address."
 (defvar ccl-loop-head nil
   "If non-nil, index of the start of the current loop.")
 (defvar ccl-breaks nil
-  "If non-nil, list of absolute addresses of the breaking points of
-the current loop.")
+  "If non-nil, list of absolute addresses of breaking points of the current 
loop.")
 
 ;;;###autoload
 (defun ccl-compile (ccl-program)
@@ -568,8 +566,8 @@ If READ-FLAG is non-nil, this statement has the form
                             (cdr (cdr cmd))))
 
 (defun ccl-compile-branch-expression (expr cmd)
-  "Compile EXPRESSION part of BRANCH statement and return register
-which holds a value of the expression."
+  "Compile EXPRESSION part of BRANCH statement.
+Return register which holds a value of the expression."
   (if (listp expr)
       ;; EXPR has the form `(EXPR2 OP ARG)'.  Compile it as SET
       ;; statement of the form `(r7 = (EXPR2 OP ARG))'.
@@ -1554,8 +1552,7 @@ MAP :=
 
 MAP-IDs := MAP-ID ...
 MAP-SET := MAP-IDs | (MAP-IDs) MAP-SET
-MAP-ID := integer
-"
+MAP-ID := integer"
   (declare (doc-string 3))
   `(let ((prog ,(unwind-protect
                    (progn
diff --git a/lisp/international/characters.el b/lisp/international/characters.el
index a877722f4e..e08dc27549 100644
--- a/lisp/international/characters.el
+++ b/lisp/international/characters.el
@@ -1428,8 +1428,12 @@ Setup `char-width-table' appropriate for non-CJK 
language environment."
 (if dump-mode
     ;; While dumping, we can't use require, and international is not
     ;; in load-path.
-    (load "international/charscript")
-  (require 'charscript))
+    (progn
+      (load "international/charscript")
+      (load "international/emoji-zwj"))
+  (progn
+    (require 'charscript)
+    (require 'emoji-zwj)))
 
 (map-charset-chars
  (lambda (range _ignore)
diff --git a/lisp/international/quail.el b/lisp/international/quail.el
index c0e53d26fb..50ff307b73 100644
--- a/lisp/international/quail.el
+++ b/lisp/international/quail.el
@@ -471,7 +471,8 @@ conversion region is active.  It is an alist of single key 
character
 vs. corresponding command to be called.
 
 If SIMPLE is non-nil, then we do not alter the meanings of
-commands such as C-f, C-b, C-n, C-p and TAB; they are treated as
+commands such as \\[forward-char], \\[backward-char], \\[next-line], \
+\\[previous-line] and \\[indent-for-tab-command]; they are treated as
 non-Quail commands."
   (let (translation-keymap conversion-keymap)
     (if deterministic (setq forget-last-selection t))
diff --git a/lisp/international/robin.el b/lisp/international/robin.el
index e4a11801c3..c38cd82269 100644
--- a/lisp/international/robin.el
+++ b/lisp/international/robin.el
@@ -276,8 +276,7 @@ this robin package will be the following.
        (?c \"AC\"
           (?d \"ACD\")
           (?e \"ACE\")))
-   (?b \"B\"))
-")
+   (?b \"B\"))")
 
 ;;;###autoload
 (defmacro robin-define-package (name docstring &rest rules)
diff --git a/lisp/isearch.el b/lisp/isearch.el
index af6217b7ca..242f2b0dd0 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -176,11 +176,11 @@ command history."
 
 (defcustom isearch-wrap-pause t
   "Define the behavior of wrapping when there are no more matches.
-When `t' (by default), signal an error when no more matches are found.
+When t (by default), signal an error when no more matches are found.
 Then after repeating the search, wrap with `isearch-wrap-function'.
 When `no', wrap immediately after reaching the last match.
 When `no-ding', wrap immediately without flashing the screen.
-When `nil', never wrap, just stop at the last match."
+When nil, never wrap, just stop at the last match."
   :type '(choice (const :tag "Pause before wrapping" t)
                  (const :tag "No pause before wrapping" no)
                  (const :tag "No pause and no flashing" no-ding)
@@ -189,9 +189,9 @@ When `nil', never wrap, just stop at the last match."
 
 (defcustom isearch-repeat-on-direction-change nil
   "Whether a direction change should move to another match.
-When `nil', the default, a direction change moves point to the other
+When nil, the default, a direction change moves point to the other
 end of the current search match.
-When `t', a direction change moves to another search match, if there
+When t, a direction change moves to another search match, if there
 is one."
   :type '(choice (const :tag "Remain on the same match" nil)
                  (const :tag "Move to another match" t))
@@ -1221,7 +1221,7 @@ is processed.  (It is not called after characters that 
exit the search.)
 
 When the arg RECURSIVE-EDIT is non-nil, this function behaves modally and
 does not return to the calling function until the search is completed.
-To behave this way it enters a recursive-edit and exits it when done
+To behave this way it enters a recursive edit and exits it when done
 isearching.
 
 The arg REGEXP-FUNCTION, if non-nil, should be a function.  It is
diff --git a/lisp/jit-lock.el b/lisp/jit-lock.el
index c1a5bbe947..bb2df2b1ff 100644
--- a/lisp/jit-lock.el
+++ b/lisp/jit-lock.el
@@ -47,7 +47,7 @@ Preserves the `buffer-modified-p' state of the current 
buffer."
 (defcustom jit-lock-chunk-size 1500
   "Jit-lock fontifies chunks of at most this many characters at a time.
 
-This variable controls both display-time and stealth fontification.
+This variable controls both `display-time' and stealth fontification.
 
 The optimum value is a little over the typical number of buffer
 characters which fit in a typical window."
diff --git a/lisp/jsonrpc.el b/lisp/jsonrpc.el
index 6b5abcbd7c..02db199c7f 100644
--- a/lisp/jsonrpc.el
+++ b/lisp/jsonrpc.el
@@ -219,7 +219,7 @@ object, using the keywords `:code', `:message' and `:data'."
                   (jsonrpc-error-message . ,msg))))
     (cl-destructuring-bind (&key code message data) args
       (signal 'jsonrpc-error
-              `(,(format "[jsonrpc] error ")
+              `("[jsonrpc] error "
                 (jsonrpc-error-code . ,code)
                 (jsonrpc-error-message . ,message)
                 (jsonrpc-error-data . ,data))))))
diff --git a/lisp/kmacro.el b/lisp/kmacro.el
index a39f433cdc..bb41a962c3 100644
--- a/lisp/kmacro.el
+++ b/lisp/kmacro.el
@@ -172,7 +172,7 @@ macro to be executed before appending to it."
     (define-key map "\C-k" #'kmacro-end-or-call-macro-repeat)
     (define-key map "r"    #'apply-macro-to-region-lines)
     (define-key map "q"    #'kbd-macro-query)  ;; Like C-x q
-    (define-key map "Q"    #'kdb-macro-redisplay)
+    (define-key map "d"    #'kdb-macro-redisplay)
 
     ;; macro ring
     (define-key map "\C-n" #'kmacro-cycle-ring-next)
@@ -820,8 +820,8 @@ If kbd macro currently being defined end it before 
activating it."
 
 (defun kmacro-bind-to-key (_arg)
   "When not defining or executing a macro, offer to bind last macro to a key.
-The key sequences [C-x C-k 0] through [C-x C-k 9] and [C-x C-k A]
-through [C-x C-k Z] are reserved for user bindings, and to bind to
+The key sequences `C-x C-k 0' through `C-x C-k 9' and `C-x C-k A'
+through `C-x C-k Z' are reserved for user bindings, and to bind to
 one of these sequences, just enter the digit or letter, rather than
 the whole sequence.
 
diff --git a/lisp/language/burmese.el b/lisp/language/burmese.el
index ade3566717..96ba775268 100644
--- a/lisp/language/burmese.el
+++ b/lisp/language/burmese.el
@@ -24,7 +24,7 @@
 ;;; Commentary:
 
 ;; The murderous generals say to call it "Myanmar".
-;; We will call it "Burma". -- rms, Chief GNUisance.
+;; We will call it "Burma".  -- rms, Chief GNUisance.
 
 ;;; Code:
 
diff --git a/lisp/language/ethio-util.el b/lisp/language/ethio-util.el
index dc385b07d3..2de6602ced 100644
--- a/lisp/language/ethio-util.el
+++ b/lisp/language/ethio-util.el
@@ -2098,6 +2098,10 @@ mark."
 ;; The ethiopic-tex package is not used for keyboard input, therefore
 ;; not registered with the register-input-method function.
 
+;; Local Variables:
+;; checkdoc-symbol-words: ("-->")
+;; End:
+
 (provide 'ethio-util)
 
 ;;; ethio-util.el ends here
diff --git a/lisp/language/japan-util.el b/lisp/language/japan-util.el
index feb75a198e..cad34e9904 100644
--- a/lisp/language/japan-util.el
+++ b/lisp/language/japan-util.el
@@ -108,7 +108,7 @@ HANKAKU-KATAKANA belongs to `japanese-jisx0201-kana'.")
     ;; cp932-2-byte
     (#x2015 ?-) (#xFF5E ?~) (#xFF0D ?-))
   "Japanese JISX0208 and CP932 symbol character table.
-  Each element is of the form (SYMBOL ASCII HANKAKU), where SYMBOL
+Each element is of the form (SYMBOL ASCII HANKAKU), where SYMBOL
 belongs to `japanese-jisx0208' or `cp932', ASCII belongs to `ascii',
 and HANKAKU belongs to `japanese-jisx0201-kana'.")
 
diff --git a/lisp/language/khmer.el b/lisp/language/khmer.el
index 471af40165..12737edc73 100644
--- a/lisp/language/khmer.el
+++ b/lisp/language/khmer.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (set-language-info-alist
diff --git a/lisp/language/sinhala.el b/lisp/language/sinhala.el
index 89392ad6c5..bf32050600 100644
--- a/lisp/language/sinhala.el
+++ b/lisp/language/sinhala.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (set-language-info-alist
diff --git a/lisp/language/tibetan.el b/lisp/language/tibetan.el
index 48c7638948..dc37fc90ac 100644
--- a/lisp/language/tibetan.el
+++ b/lisp/language/tibetan.el
@@ -593,8 +593,8 @@ from an input method is converted to the corresponding 
precomposed glyph.")
       (setq temp (concat temp "\\|" (car (car l))))
       (setq l (cdr l)))
     (concat temp "\\)")))
-  "Regexp string to match a sequence of Tibetan consonantic components, i.e.,
-one base consonant and one or more subjoined consonants.
+  "Regexp string to match a sequence of Tibetan consonantic components.
+That is, one base consonant and one or more subjoined consonants.
 The result of matching is to be used for indexing alist when the component
 sequence is converted to the corresponding precomposed glyph.
 This also matches some punctuation characters which need conversion.")
diff --git a/lisp/language/tv-util.el b/lisp/language/tv-util.el
index d380630c0a..b0527060db 100644
--- a/lisp/language/tv-util.el
+++ b/lisp/language/tv-util.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (defconst tai-viet-re "[\xaa80-\xaac2\xaadb-\xaadf]+"
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index 9cd5c9bfa8..0ab9552c60 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -26590,7 +26590,7 @@ Save the result in `project-list-file' if the list of 
projects has changed.
 
 \(fn PR)" nil nil)
 
-(autoload 'project-remove-known-project "project" "\
+(autoload 'project-forget-project "project" "\
 Remove directory PROJECT-ROOT from the project list.
 PROJECT-ROOT is the root directory of a known project listed in
 the project list.
diff --git a/lisp/loadhist.el b/lisp/loadhist.el
index 0b12bdad05..4a7946a212 100644
--- a/lisp/loadhist.el
+++ b/lisp/loadhist.el
@@ -168,8 +168,7 @@ documentation of `unload-feature' for details.")
 ;; So we use this auxiliary variable to keep track of the last (t . SYMBOL)
 ;; that occurred.
 (defvar loadhist--restore-autoload nil
-  "If non-nil, this is a symbol for which we should
-restore a previous autoload if possible.")
+  "If non-nil, is a symbol for which to try to restore a previous autoload.")
 
 (cl-defmethod loadhist-unload-element ((x (head t)))
   (setq loadhist--restore-autoload (cdr x)))
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 0ea441de01..fce17bf113 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -275,7 +275,6 @@
 (load "textmodes/paragraphs")
 (load "progmodes/prog-mode")
 (load "emacs-lisp/lisp-mode")
-(load "progmodes/elisp-mode")
 (load "textmodes/text-mode")
 (load "textmodes/fill")
 (load "newcomment")
@@ -339,6 +338,13 @@
     ;; Do it after loading term/foo-win.el since the value of the
     ;; mouse-wheel-*-event vars depends on those files being loaded or not.
     (load "mwheel"))
+
+;; progmodes/elisp-mode.el must be after w32-fns.el, to avoid this:
+;;"Eager macro-expansion failure: (void-function 
w32-convert-standard-filename)"
+;; which happens while processing 'elisp-flymake-byte-compile', when
+;; elisp-mode.elc is outdated.
+(load "progmodes/elisp-mode")
+
 ;; Preload some constants and floating point functions.
 (load "emacs-lisp/float-sup")
 
@@ -535,7 +541,8 @@ lost after dumping")))
       (let (success)
         (unwind-protect
              (let ((tmp-dump-mode dump-mode)
-                   (dump-mode nil))
+                   (dump-mode nil)
+                   (lexical-binding nil))
                (if (member tmp-dump-mode '("pdump" "pbootstrap"))
                    (dump-emacs-portable (expand-file-name output 
invocation-directory))
                  (dump-emacs output "temacs")
diff --git a/lisp/locate.el b/lisp/locate.el
index 008d65e055..6190fc6302 100644
--- a/lisp/locate.el
+++ b/lisp/locate.el
@@ -50,7 +50,7 @@
 ;; from a shell prompt.  GNU locate and BSD find expect the file databases
 ;; to either be in standard places or located via environment variables.
 ;; If the latter, make sure these environment variables are set in
-;; your emacs process.
+;; your Emacs process.
 ;;
 ;; Locate-mode assumes that each line output from the locate-command
 ;; consists exactly of a file name, possibly preceded or trailed by
diff --git a/lisp/macros.el b/lisp/macros.el
index 689c4210cd..89e38abab2 100644
--- a/lisp/macros.el
+++ b/lisp/macros.el
@@ -148,11 +148,16 @@ use this command, and then save the file."
 ;;;###autoload
 (defun kbd-macro-query (flag)
   "Query user during kbd macro execution.
-  With prefix argument, enters recursive edit, reading keyboard
-commands even within a kbd macro.  You can give different commands
-each time the macro executes.
-  Without prefix argument, asks whether to continue running the macro.
+
+With prefix argument FLAG, enter recursive edit, reading
+keyboard commands even within a kbd macro.  You can give
+different commands each time the macro executes.
+
+Without prefix argument, ask whether to continue running the
+macro.
+
 Your options are: \\<query-replace-map>
+
 \\[act]        Finish this iteration normally and continue with the next.
 \\[skip]       Skip the rest of this iteration, and start the next.
 \\[exit]       Stop the macro entirely right now.
diff --git a/lisp/mail/emacsbug.el b/lisp/mail/emacsbug.el
index 14c93f2fc8..3da1e8b25e 100644
--- a/lisp/mail/emacsbug.el
+++ b/lisp/mail/emacsbug.el
@@ -340,7 +340,7 @@ usually do not have translators for other languages.\n\n")))
     (insert (format "\nFeatures:\n%s\n" features))
     (fill-region (line-beginning-position 0) (point))
 
-    (insert (format "\nMemory information:\n"))
+    (insert "\nMemory information:\n")
     (pp (garbage-collect) (current-buffer))
 
     ;; This is so the user has to type something in order to send easily.
diff --git a/lisp/mail/sendmail.el b/lisp/mail/sendmail.el
index fee11c06aa..312805f6d8 100644
--- a/lisp/mail/sendmail.el
+++ b/lisp/mail/sendmail.el
@@ -277,6 +277,7 @@ The default value matches citations like `foo-bar>' plus 
whitespace."
     (define-key map "\C-c\C-f\C-r" 'mail-reply-to)
     (define-key map "\C-c\C-f\C-a" 'mail-mail-reply-to)    ; author
     (define-key map "\C-c\C-f\C-l" 'mail-mail-followup-to) ; list
+    (define-key map "\C-c\C-f\C-d" 'mail-insert-disposition-notification-to)
     (define-key map "\C-c\C-t" 'mail-text)
     (define-key map "\C-c\C-y" 'mail-yank-original)
     (define-key map "\C-c\C-r" 'mail-yank-region)
@@ -325,6 +326,9 @@ The default value matches citations like `foo-bar>' plus 
whitespace."
     (define-key map [menu-bar headers expand-aliases]
       '("Expand Aliases" . expand-mail-aliases))
 
+    (define-key map [menu-bar headers disposition-notification]
+      '("Disposition-Notification-To" . 
mail-insert-disposition-notification-to))
+
     (define-key map [menu-bar headers mail-reply-to]
       '("Mail-Reply-To" . mail-mail-reply-to))
 
@@ -1598,6 +1602,25 @@ Returns non-nil if FIELD was originally present."
   (interactive)
   (expand-abbrev)
   (goto-char (mail-text-start)))
+
+(defun mail-insert-disposition-notification-to ()
+  "Insert a Disposition-Notification-To header, if it doesn't already exist."
+  (interactive)
+  (expand-abbrev)
+  (save-excursion
+    (or (mail-position-on-field "Disposition-Notification-To")
+        (insert
+        (format
+         "%s"
+         (save-excursion
+            (save-restriction
+              (message-narrow-to-headers)
+              (or (mail-fetch-field "Reply-To")
+                  (mail-fetch-field "From")
+                  (with-temp-buffer
+                    (mail-insert-from-field)
+                    (substring (buffer-string) (length "From: ") -1))))))))))
+
 
 (defun mail-signature (&optional atpoint)
   "Sign letter with signature.
diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el
index ec9f340db8..bd8aa611e9 100644
--- a/lisp/mail/smtpmail.el
+++ b/lisp/mail/smtpmail.el
@@ -829,15 +829,15 @@ Returns an error if the server cannot be contacted."
 
            (when (or (member 'onex supported-extensions)
                      (member 'xone supported-extensions))
-             (smtpmail-command-or-throw process (format "ONEX")))
+             (smtpmail-command-or-throw process "ONEX"))
 
            (when (and smtpmail-debug-verb
                       (or (member 'verb supported-extensions)
                           (member 'xvrb supported-extensions)))
-             (smtpmail-command-or-throw process (format "VERB")))
+             (smtpmail-command-or-throw process "VERB"))
 
            (when (member 'xusr supported-extensions)
-             (smtpmail-command-or-throw process (format "XUSR")))
+             (smtpmail-command-or-throw process "XUSR"))
 
            ;; MAIL FROM:<sender>
            (let ((size-part
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index d863f34df1..e84eec5002 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -1315,6 +1315,11 @@ mail status in mode line"))
                   :visible (and (display-graphic-p) (fboundp 'x-show-tip))
                   :button (:toggle . tooltip-mode)))
 
+    (bindings--define-key menu [showhide-context-menu]
+      '(menu-item "Context Menus" context-menu-mode
+                  :help "Turn mouse-3 context menus on/off"
+                  :button (:toggle . context-menu-mode)))
+
     (bindings--define-key menu [menu-bar-mode]
       '(menu-item "Menu Bar" toggle-menu-bar-mode-from-frame
                   :help "Turn menu bar on/off"
@@ -2151,7 +2156,7 @@ otherwise it could decide to silently do nothing."
     (> count 1)))
 
 (defcustom yank-menu-length 20
-  "Maximum length to display in the yank-menu."
+  "Maximum length to display in the `yank-menu'."
   :type 'integer
   :group 'menu)
 
@@ -2284,7 +2289,7 @@ Buffers menu is regenerated."
 It must accept a buffer as its only required argument.")
 
 (defun menu-bar-buffer-vector (alist)
-  ;; turn ((name . buffer) ...) into a menu
+  "Turn ((name . buffer) ...) into a menu."
   (let ((buffers-vec (make-vector (length alist) nil))
         (i (length alist)))
     (dolist (pair alist)
@@ -2298,7 +2303,7 @@ It must accept a buffer as its only required argument.")
     buffers-vec))
 
 (defun menu-bar-update-buffers (&optional force)
-  ;; If user discards the Buffers item, play along.
+  "If user discards the Buffers item, play along."
   (and (lookup-key (current-global-map) [menu-bar buffer])
        (or force (frame-or-buffer-changed-p))
        (let ((buffers (buffer-list))
diff --git a/lisp/mh-e/mh-seq.el b/lisp/mh-e/mh-seq.el
index 9cdf39f7f1..a50319a455 100644
--- a/lisp/mh-e/mh-seq.el
+++ b/lisp/mh-e/mh-seq.el
@@ -187,7 +187,7 @@ MESSAGE appears."
     (message "Message %d%s is in sequences: %s"
              message
              (cond (dest-folder (format " (to be refiled to %s)" dest-folder))
-                   (deleted-flag (format " (to be deleted)"))
+                   (deleted-flag " (to be deleted)")
                    (t ""))
              (mapconcat #'concat
                         (mh-list-to-string (mh-seq-containing-msg message t))
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 9668e7c732..1e1a6f852e 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -848,7 +848,7 @@ via `set-message-function'."
                 (run-with-timer minibuffer-message-clear-timeout nil
                                 #'clear-minibuffer-message)))
 
-        ;; Return `t' telling the caller that the message
+        ;; Return t telling the caller that the message
         ;; was handled specially by this function.
         t))))
 
@@ -1824,8 +1824,9 @@ in one column."
 
 (defcustom completions-detailed nil
   "When non-nil, display completions with details added as prefix/suffix.
-Some commands might provide a detailed view with more information prepended
-or appended to completions."
+This makes some commands (for instance, \\[describe-symbol]) provide a
+detailed view with more information prepended or appended to
+completions."
   :type 'boolean
   :version "28.1")
 
@@ -2349,14 +2350,18 @@ that displays the \"*Completions*\" buffer."
 
 (add-hook 'minibuffer-exit-hook 'minibuffer-restore-windows)
 
-(defun minibuffer-quit-recursive-edit ()
-  "Quit the command that requested this recursive edit without error.
-Like `abort-recursive-edit' without aborting keyboard macro
-execution."
-  ;; See Info node `(elisp)Recursive Editing' for an explanation of
-  ;; throwing a function to `exit'.
-  (throw 'exit (lambda ()
-                 (signal 'minibuffer-quit nil))))
+(defun minibuffer-quit-recursive-edit (&optional levels)
+  "Quit the command that requested this recursive edit or minibuffer input.
+Do so without terminating keyboard macro recording or execution.
+LEVELS specifies the number of nested recursive edits to quit.
+If nil, it defaults to 1."
+  (unless levels
+    (setq levels 1))
+  (if (> levels 1)
+      ;; See Info node `(elisp)Recursive Editing' for an explanation
+      ;; of throwing a function to `exit'.
+      (throw 'exit (lambda () (minibuffer-quit-recursive-edit (1- levels))))
+    (throw 'exit (lambda () (signal 'minibuffer-quit nil)))))
 
 (defun self-insert-and-exit ()
   "Terminate minibuffer input."
diff --git a/lisp/mouse-drag.el b/lisp/mouse-drag.el
index b424b6edfe..ecfb359b36 100644
--- a/lisp/mouse-drag.el
+++ b/lisp/mouse-drag.el
@@ -147,7 +147,7 @@ Keep the cursor on the screen as needed."
      (= (cdr start-col-row) (cdr end-col-row)))))
 
 (defvar mouse-drag-electric-col-scrolling t
-  "If non-nil, mouse-drag on a long line enables truncate-lines.")
+  "If non-nil, mouse-drag on a long line enables `truncate-lines'.")
 
 (defun mouse-drag-should-do-col-scrolling ()
   "Determine if it's wise to enable col-scrolling for the current window.
diff --git a/lisp/mouse.el b/lisp/mouse.el
index f33a73f03f..8ad3f7664a 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -46,7 +46,7 @@
   :type 'boolean)
 
 (defcustom mouse-drag-copy-region nil
-  "If non-nil, copy to kill-ring upon mouse adjustments of the region.
+  "If non-nil, copy to kill ring upon mouse adjustments of the region.
 
 This affects `mouse-save-then-kill' (\\[mouse-save-then-kill]) in
 addition to mouse drags.
@@ -418,16 +418,16 @@ Some context functions add menu items below the 
separator."
                  (listp pending-undo-list)
                (consp buffer-undo-list)))
     (define-key-after menu [undo]
-      '(menu-item "Undo" undo
+      `(menu-item ,(if (region-active-p) "Undo in Region" "Undo") undo
                   :help "Undo last edits")))
   (when (and (not buffer-read-only)
              (undo--last-change-was-undo-p buffer-undo-list))
     (define-key-after menu [undo-redo]
-      '(menu-item "Redo" undo-redo
+      `(menu-item (if undo-in-region "Redo in Region" "Redo") undo-redo
                   :help "Redo last undone edits")))
   menu)
 
-(defun context-menu-region (menu _click)
+(defun context-menu-region (menu click)
   "Populate MENU with region commands."
   (define-key-after menu [separator-region] menu-bar-separator)
   (when (and mark-active (not buffer-read-only))
@@ -455,21 +455,55 @@ Some context functions add menu items below the 
separator."
       `(menu-item "Paste" mouse-yank-at-click
                   :help "Paste (yank) text most recently cut/copied")))
   (when (and (cdr yank-menu) (not buffer-read-only))
-    (define-key-after menu (if (featurep 'ns) [select-paste]
-                             [paste-from-menu])
-      ;; ns-win.el said: Change text to be more consistent with
-      ;; surrounding menu items `paste', etc."
-      `(menu-item ,(if (featurep 'ns) "Select and Paste" "Paste from Kill 
Menu")
-                  yank-menu
-                  :help "Choose a string from the kill ring and paste it")))
+    (let ((submenu (make-sparse-keymap (propertize "Paste from Kill Menu")))
+          (i 0))
+      (dolist (item (reverse yank-menu))
+        (when (consp item)
+          (define-key submenu (vector (setq i (1+ i)))
+            `(menu-item ,(cadr item)
+                        ,(lambda () (interactive)
+                           (mouse-yank-from-menu click (car item)))))))
+      (define-key-after menu (if (featurep 'ns) [select-paste] 
[paste-from-menu])
+        `(menu-item ,(if (featurep 'ns) "Select and Paste" "Paste from Kill 
Menu")
+                    ,submenu
+                    :help "Choose a string from the kill ring and paste it"))))
   (when (and mark-active (not buffer-read-only))
     (define-key-after menu [clear]
       '(menu-item "Clear" delete-active-region
                   :help
                   "Delete text in region between mark and current position")))
-  (define-key-after menu [mark-whole-buffer]
-    '(menu-item "Select All" mark-whole-buffer
-                :help "Mark the whole buffer for a subsequent cut/copy"))
+
+  (let ((submenu (make-sparse-keymap (propertize "Select"))))
+    (define-key-after submenu [mark-whole-buffer]
+      `(menu-item "All"
+                  ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 
'buffer))
+                  :help "Mark the whole buffer for a subsequent cut/copy"))
+    (define-key-after submenu [mark-defun]
+      `(menu-item "Defun"
+                  ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 
'defun))
+                  :help "Mark the defun at click for a subsequent cut/copy"))
+    (define-key-after submenu [mark-list-or-string]
+      `(menu-item ,(if (nth 8 (save-excursion
+                                (syntax-ppss (posn-point (event-end click)))))
+                       "String" "List")
+                  ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 
'list-or-string))
+                  :help "Mark list or string at click for a subsequent 
cut/copy"))
+    (define-key-after submenu [mark-line]
+      `(menu-item "Line"
+                  ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 'line))
+                  :help "Mark the line at click for a subsequent cut/copy"))
+    (define-key-after submenu [mark-symbol]
+      `(menu-item "Symbol"
+                  ,(lambda (e) (interactive "e") (mark-thing-at-mouse e 
'symbol))
+                  :help "Mark the symbol at click for a subsequent cut/copy"))
+    (when (region-active-p)
+      (define-key-after submenu [mark-none]
+        `(menu-item "None"
+                    ,(lambda (_e) (interactive "e") (deactivate-mark))
+                    :help "Deactivate the region")))
+
+    (define-key-after menu [select-region]
+      `(menu-item "Select" ,submenu)))
   menu)
 
 (defun context-menu-ffap (menu click)
@@ -517,6 +551,26 @@ This is the keyboard interface to \\[context-menu-map]."
 
 (global-set-key [S-f10] 'context-menu-open)
 
+(defun mark-thing-at-mouse (click thing)
+  "Activate the region around THING found near the mouse CLICK."
+  (let ((bounds (bounds-of-thing-at-mouse click thing)))
+    (when bounds
+      (goto-char (if mouse-select-region-move-to-beginning
+                     (car bounds) (cdr bounds)))
+      (push-mark (if mouse-select-region-move-to-beginning
+                     (cdr bounds) (car bounds))
+                 t 'activate))))
+
+(defun mouse-yank-from-menu (click string)
+  "Insert STRING at mouse CLICK."
+  ;; Give temporary modes such as isearch a chance to turn off.
+  (run-hooks 'mouse-leave-buffer-hook)
+  (when select-active-regions
+    (deactivate-mark))
+  (or mouse-yank-at-point (mouse-set-point click))
+  (push-mark)
+  (insert string))
+
 
 ;; Commands that operate on windows.
 
diff --git a/lisp/net/ange-ftp.el b/lisp/net/ange-ftp.el
index 25ae20702a..56a1d76d71 100644
--- a/lisp/net/ange-ftp.el
+++ b/lisp/net/ange-ftp.el
@@ -1357,7 +1357,7 @@ only return the directory part of FILE."
 
 (defun ange-ftp-parse-netrc ()
   ;; We set this before actually doing it to avoid the possibility
-  ;; of an infinite loop if ange-ftp-netrc-filename is an FTP file.
+  ;; of an infinite loop if `ange-ftp-netrc-filename' is an FTP file.
   (interactive)
   (let (file attr)
     (let ((default-directory "/"))
@@ -3591,11 +3591,11 @@ Value is (0 0) if the modification time cannot be 
determined."
       (ange-ftp-real-verify-visited-file-modtime buf))))
 
 (defun ange-ftp-file-size (file &optional ascii-mode)
-  "Return the size of remote file FILE. Return -1 if can't get it.
-If ascii-mode is non-nil, return the size with the extra octets that
+  "Return the size of remote file FILE.  Return -1 if can't get it.
+If ASCII-MODE is non-nil, return the size with the extra octets that
 need to be inserted, one at the end of each line, to provide correct
-end-of-line semantics for a transfer using TYPE=A. The default is nil,
-so return the size on the remote host exactly. See RFC 3659."
+end-of-line semantics for a transfer using TYPE=A.  The default is nil,
+so return the size on the remote host exactly.  See RFC 3659."
   (let* ((parsed (ange-ftp-ftp-name file))
         (host (nth 0 parsed))
         (user (nth 1 parsed))
diff --git a/lisp/net/eudc-bob.el b/lisp/net/eudc-bob.el
index 1d7af7f5b5..7ad92b22af 100644
--- a/lisp/net/eudc-bob.el
+++ b/lisp/net/eudc-bob.el
@@ -252,17 +252,14 @@ display a button."
 
 ;; If the first arguments can be nil here, then these 3 can be
 ;; defconsts once more.
-(easy-menu-define eudc-bob-generic-menu
-  eudc-bob-generic-keymap
-  ""
+(easy-menu-define eudc-bob-generic-menu eudc-bob-generic-keymap
+  "EUDC Binary Object Menu."
   eudc-bob-generic-menu)
-(easy-menu-define eudc-bob-image-menu
-  eudc-bob-image-keymap
-  ""
+(easy-menu-define eudc-bob-image-menu eudc-bob-image-keymap
+  "EUDC Image Menu."
   eudc-bob-image-menu)
-(easy-menu-define eudc-bob-sound-menu
-  eudc-bob-sound-keymap
-  ""
+(easy-menu-define eudc-bob-sound-menu eudc-bob-sound-keymap
+  "EUDC Sound Menu."
   eudc-bob-sound-menu)
 
 ;;;###autoload
diff --git a/lisp/net/eudc-hotlist.el b/lisp/net/eudc-hotlist.el
index a737a99ce9..43c1a2886f 100644
--- a/lisp/net/eudc-hotlist.el
+++ b/lisp/net/eudc-hotlist.el
@@ -174,9 +174,8 @@ These are the special commands of this mode:
     ["Save and Quit" eudc-hotlist-quit-edit t]
     ["Exit without Saving" kill-this-buffer t]))
 
-(easy-menu-define eudc-hotlist-emacs-menu
-    eudc-hotlist-mode-map
-    ""
+(easy-menu-define eudc-hotlist-emacs-menu eudc-hotlist-mode-map
+    "EUDC hotlist Menu."
     eudc-hotlist-menu)
 
 ;;; eudc-hotlist.el ends here
diff --git a/lisp/net/eudcb-ldap.el b/lisp/net/eudcb-ldap.el
index 0aff276475..fc48656726 100644
--- a/lisp/net/eudcb-ldap.el
+++ b/lisp/net/eudcb-ldap.el
@@ -202,7 +202,7 @@ attribute names are returned.  Default to `person'."
   "Check if the current LDAP server has a configured search base."
   (unless (or (eudc-ldap-get-host-parameter eudc-server 'base)
              ldap-default-base
-             (null (y-or-n-p "No search base defined. Configure it now? ")))
+              (null (y-or-n-p "No search base defined.  Configure it now?")))
     ;; If the server is not in ldap-host-parameters-alist we add it for the
     ;; user
     (if (null (assoc eudc-server ldap-host-parameters-alist))
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index c1202974f4..701dc4fade 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -57,7 +57,7 @@
   :type 'string)
 
 (defcustom eww-use-browse-url "\\`mailto:";
-  "eww will use `browse-url' when following links that match this regexp.
+  "EWW will use `browse-url' when following links that match this regexp.
 The action to be taken can be further customized via
 `browse-url-handlers'."
   :version "28.1"
@@ -143,11 +143,13 @@ The string will be passed through 
`substitute-command-keys'."
 
 (defcustom eww-retrieve-command nil
   "Command to retrieve an URL via an external program.
-If nil, `url-retrieve' is used to download the data.  If non-nil,
-this should be a list where the first item is the program, and
-the rest are the arguments."
+If nil, `url-retrieve' is used to download the data.
+If `sync', `url-retrieve-synchronously' is used.
+For other non-nil values, this should be a list where the first item
+is the program, and the rest are the arguments."
   :version "28.1"
   :type '(choice (const :tag "Use `url-retrieve'" nil)
+                 (const :tag "Use `url-retrieve-synchronously'" sync)
                  (repeat string)))
 
 (defcustom eww-use-external-browser-for-content-type
@@ -366,9 +368,16 @@ killed after rendering."
                     (list url nil (current-buffer))))))
 
 (defun eww-retrieve (url callback cbargs)
-  (if (null eww-retrieve-command)
-      (url-retrieve url #'eww-render
-                    (list url nil (current-buffer)))
+  (cond
+   ((null eww-retrieve-command)
+    (url-retrieve url #'eww-render
+                  (list url nil (current-buffer))))
+   ((eq eww-retrieve-command 'sync)
+    (let ((orig-buffer (current-buffer))
+          (data-buffer (url-retrieve-synchronously url)))
+      (with-current-buffer data-buffer
+        (eww-render nil url nil orig-buffer))))
+   (t
     (let ((buffer (generate-new-buffer " *eww retrieve*"))
           (error-buffer (generate-new-buffer " *eww error*")))
       (with-current-buffer buffer
@@ -388,7 +397,7 @@ killed after rendering."
                          (with-current-buffer buffer
                            (goto-char (point-min))
                            (insert "Content-type: text/html; 
charset=utf-8\n\n")
-                           (apply #'funcall callback nil cbargs))))))))))
+                           (apply #'funcall callback nil cbargs)))))))))))
 
 (function-put 'eww 'browse-url-browser-kind 'internal)
 
@@ -2398,13 +2407,14 @@ Otherwise, the restored buffer will contain a prompt to 
do so by using
 
 (defun eww-isearch-next-buffer (&optional _buffer wrap)
   "Go to the next page to search using `rel' attribute for navigation."
-  (if wrap
-      (condition-case nil
-         (eww-top-url)
-       (error nil))
-    (if isearch-forward
-       (eww-next-url)
-      (eww-previous-url)))
+  (let ((eww-retrieve-command 'sync))
+    (if wrap
+        (condition-case nil
+           (eww-top-url)
+         (error nil))
+      (if isearch-forward
+         (eww-next-url)
+        (eww-previous-url))))
   (current-buffer))
 
 (provide 'eww)
diff --git a/lisp/net/hmac-def.el b/lisp/net/hmac-def.el
index 5ea8839699..5af6d4324a 100644
--- a/lisp/net/hmac-def.el
+++ b/lisp/net/hmac-def.el
@@ -34,8 +34,8 @@ HMAC function is H(KEY XOR opad, H(KEY XOR ipad, TEXT)):
 
 H is a cryptographic hash function, such as SHA1 and MD5, which takes
 a string and return a digest of it (in binary form).
-B is a byte-length of a block size of H. (B=64 for both SHA1 and MD5.)
-L is a byte-length of hash outputs. (L=16 for MD5, L=20 for SHA1.)
+B is a byte length of a block size of H. (B=64 for both SHA1 and MD5.)
+L is a byte length of hash outputs.  (L=16 for MD5, L=20 for SHA1.)
 If BIT is non-nil, truncate output to specified bits."
   `(defun ,name (text key)
      ,(concat "Compute "
diff --git a/lisp/net/ldap.el b/lisp/net/ldap.el
index 8b63dce211..8b35a2d8e1 100644
--- a/lisp/net/ldap.el
+++ b/lisp/net/ldap.el
@@ -154,8 +154,7 @@ Valid properties include:
                 (string :tag "Argument")))
 
 (defcustom ldap-ldapsearch-password-prompt-regexp "Enter LDAP Password: "
-  "A regular expression used to recognize the `ldapsearch'
-program's password prompt."
+  "Regexp used to recognize the `ldapsearch' program's password prompt."
   :type 'regexp
   :version "25.1")
 
diff --git a/lisp/net/net-utils.el b/lisp/net/net-utils.el
index 90cca7d415..6f44d9844e 100644
--- a/lisp/net/net-utils.el
+++ b/lisp/net/net-utils.el
@@ -885,9 +885,9 @@ and `network-connection-service-alist', which see."
   :type '(repeat (cons string string)))
 
 (defcustom whois-guess-server t
-  "If non-nil then whois will try to deduce the appropriate whois
-server from the query.  If the query doesn't look like a domain or hostname
-then the server named by `whois-server-name' is used."
+  "If non-nil, try to deduce the appropriate whois server from the query.
+If the query doesn't look like a domain or hostname then the
+server named by `whois-server-name' is used."
   :type 'boolean)
 
 (defun whois-get-tld (host)
@@ -943,7 +943,7 @@ The port is deduced from 
`network-connection-service-alist'."
 ;; Using a derived mode gives us keymaps, hooks, etc.
 (define-derived-mode
   network-connection-mode comint-mode "Network-Connection"
-  "Major mode for interacting with the network-connection program.")
+  "Major mode for interacting with the `network-connection' program.")
 
 (defun network-connection-mode-setup (host service)
   (setq-local network-connection-host host)
diff --git a/lisp/net/newst-backend.el b/lisp/net/newst-backend.el
index dc54194358..27ea713d0e 100644
--- a/lisp/net/newst-backend.el
+++ b/lisp/net/newst-backend.el
@@ -2183,7 +2183,7 @@ FEED is a symbol!"
       (progn
         (when (y-or-n-p "Old newsticker cache file exists.  Read it? ")
           (newsticker--cache-read-version1))
-        (when (y-or-n-p (format "Delete old newsticker cache file? "))
+        (when (y-or-n-p "Delete old newsticker cache file? ")
           (delete-file newsticker-cache-filename)))
     (dolist (f (append newsticker-url-list-defaults newsticker-url-list))
       (newsticker--cache-read-feed (car f)))))
diff --git a/lisp/net/ntlm.el b/lisp/net/ntlm.el
index 0450c80c2e..747a69fb5d 100644
--- a/lisp/net/ntlm.el
+++ b/lisp/net/ntlm.el
@@ -405,8 +405,8 @@ by PASSWORD-HASHES.  PASSWORD-HASHES should be a return 
value of
        (ntlm-md4hash password)))
 
 (defun ntlm-ascii2unicode (str len)
-  "Convert an ASCII string into a NT Unicode string, which is
-little-endian utf16."
+  "Convert an ASCII string STR of length LEN into a NT Unicode string.
+NT Unicode strings are little-endian utf16."
   ;; FIXME: Can't we use encode-coding-string with a `utf-16le' coding system?
   (let ((utf (make-string (* 2 len) 0))
         (i 0)
@@ -428,25 +428,24 @@ little-endian utf16."
     buf))
 
 (defun ntlm-smb-passwd-hash (passwd)
-  "Return the SMB password hash string of 16 bytes long for the given password
-string PASSWD.  PASSWD is truncated to 14 bytes if longer."
+  "Return SMB password hash string of 16 bytes long for password string PASSWD.
+PASSWD is truncated to 14 bytes if longer."
   (let ((len (min (length passwd) 14)))
     (ntlm-smb-des-e-p16
      (concat (substring (upcase passwd) 0 len) ;fill top 14 bytes with passwd
             (make-string (- 15 len) 0)))))
 
 (defun ntlm-smb-owf-encrypt (passwd c8)
-  "Return the response string of 24 bytes long for the given password
-string PASSWD based on the DES encryption.  PASSWD is of at most 14
-bytes long and the challenge string C8 of 8 bytes long."
+  "Return response string of 24 bytes long for password string PASSWD based on 
DES encryption.
+PASSWD is of at most 14 bytes long and the challenge string C8 of
+8 bytes long."
   (let* ((len (min (length passwd) 16))
          (p22 (concat (substring passwd 0 len) ;Fill top 16 bytes with passwd.
                      (make-string (- 22 len) 0))))
     (ntlm-smb-des-e-p24 p22 c8)))
 
 (defun ntlm-smb-des-e-p24 (p22 c8)
-  "Return a 24 bytes hashed string for a 21 bytes string P22 and a 8 bytes
-string C8."
+  "Return 24 bytes hashed string for a 21 bytes string P22 and a 8 bytes 
string C8."
   (concat (ntlm-smb-hash c8 p22 t)             ;hash first 8 bytes of p22
          (ntlm-smb-hash c8 (substring p22 7) t)
          (ntlm-smb-hash c8 (substring p22 14) t)))
@@ -460,8 +459,8 @@ string C8."
                         (substring p15 7) t)))
 
 (defun ntlm-smb-hash (in key forw)
-  "Return the hash string of length 8 for a string IN of length 8 and
-a string KEY of length 8.  FORW is t or nil."
+  "Return hash string of length 8 for a string IN of length 8 and a string KEY 
of length 8.
+FORW is t or nil."
   (let ((out (make-string 8 0))
        (inb (make-string 64 0))
        (keyb (make-string 64 0))
@@ -603,8 +602,8 @@ a string KEY of length 8.  FORW is t or nil."
                     [ 2  1 14  7  4 10  8 13 15 12  9  0  3  5  6 11]]])
 
 (defsubst ntlm-string-permute (in perm n)
-  "Return a string of length N for a string IN and a permutation vector
-PERM of size N.  The length of IN should be height of PERM."
+  "Return string of length N for string IN and permutation vector PERM of size 
N.
+The length of IN should be height of PERM."
   (let ((i 0) (out (make-string n 0)))
     (while (< i n)
       (aset out i (aref in (- (aref perm i) 1)))
@@ -701,8 +700,8 @@ backward."
     (ntlm-string-permute rl ntlm-smb-perm6 64)))
 
 (defun ntlm-md4hash (passwd)
-  "Return the 16 bytes MD4 hash of a string PASSWD after converting it
-into a Unicode string.  PASSWD is truncated to 128 bytes if longer."
+  "Return 16 bytes MD4 hash of string PASSWD after converting it to Unicode.
+PASSWD is truncated to 128 bytes if longer."
   (let* ((len (min (length passwd) 128)) ;Pwd can't be > than 128 characters.
          ;; Password must be converted to NT Unicode.
          (wpwd (ntlm-ascii2unicode passwd len)))
diff --git a/lisp/net/quickurl.el b/lisp/net/quickurl.el
index 046953faf6..7f147fa0de 100644
--- a/lisp/net/quickurl.el
+++ b/lisp/net/quickurl.el
@@ -284,7 +284,7 @@ It also restores point after the `read'."
   "Return URL associated with key LOOKUP.
 
 The lookup is done by looking in the alist `quickurl-urls' and the `cons'
-for the URL is returned. The actual method used to look into the alist
+for the URL is returned.  The actual method used to look into the alist
 depends on the setting of the variable `quickurl-assoc-function'."
   (funcall quickurl-assoc-function lookup quickurl-urls))
 
diff --git a/lisp/net/rlogin.el b/lisp/net/rlogin.el
index 3136e53b80..a7001c1310 100644
--- a/lisp/net/rlogin.el
+++ b/lisp/net/rlogin.el
@@ -238,8 +238,8 @@ ange-ftp.  If called as a function, give it no argument.
 If called with a negative prefix argument, disable directory tracking
 entirely.
 
-If called with a positive, numeric prefix argument, e.g.
-`\\[universal-argument] 1 M-x rlogin-directory-tracking-mode',
+If called with a positive, numeric prefix argument, for example
+\\[universal-argument] 1 \\[rlogin-directory-tracking-mode],
 then do directory tracking but assume the remote filesystem is the same as
 the local system.  This only works in general if the remote machine and the
 local one share the same directories (e.g. through NFS)."
diff --git a/lisp/net/sasl-ntlm.el b/lisp/net/sasl-ntlm.el
index dfb7e71330..9a5bba5b29 100644
--- a/lisp/net/sasl-ntlm.el
+++ b/lisp/net/sasl-ntlm.el
@@ -37,8 +37,8 @@
   '(ignore                             ;nothing to do before making
     sasl-ntlm-request                  ;authentication request
     sasl-ntlm-response)                        ;response to challenge
-  "A list of functions to be called in sequence for the NTLM
-authentication steps.  They are called by `sasl-next-step'.")
+  "List of functions to call in sequence for the NTLM authentication steps.
+They are called by `sasl-next-step'.")
 
 (defun sasl-ntlm-request (client _step)
   "SASL step function to generate a NTLM authentication request to the server.
diff --git a/lisp/net/soap-inspect.el b/lisp/net/soap-inspect.el
index 2192a68791..b994b0ed86 100644
--- a/lisp/net/soap-inspect.el
+++ b/lisp/net/soap-inspect.el
@@ -124,7 +124,7 @@ This is a specialization of `soap-sample-value' for
          (format "a string between %d and %d chars long" low high))
         (low (format "a string at least %d chars long" low))
         (high (format "a string at most %d chars long" high))
-        (t (format "a string OOPS")))))
+        (t "a string OOPS"))))
     ((soap-xs-simple-type-integer-range type)
      (cl-destructuring-bind (min . max) (soap-xs-simple-type-integer-range 
type)
        (cond
diff --git a/lisp/net/socks.el b/lisp/net/socks.el
index 7ac8bbbf1b..be299603a8 100644
--- a/lisp/net/socks.el
+++ b/lisp/net/socks.el
@@ -154,7 +154,7 @@
 
 (defcustom socks-server
   (list "Default server" "socks" 1080 5)
-  ""
+  "Socks server."
   :type '(list
          (string :format "" :value "Default server")
          (string :tag "Server")
diff --git a/lisp/net/telnet.el b/lisp/net/telnet.el
index 9aa5d50d6c..1cf07a5cce 100644
--- a/lisp/net/telnet.el
+++ b/lisp/net/telnet.el
@@ -73,8 +73,9 @@ LOGIN-NAME, which is optional, says what to log in as on that 
machine.")
 (defvar telnet-prompt-pattern "^[^#$%>\n]*[#$%>] *")
 (defvar telnet-replace-c-g nil)
 (defvar-local telnet-remote-echoes t
-  "True if the telnet process will echo input.")
-(defvar-local telnet-interrupt-string "\C-c" "String sent by C-c.")
+  "Non-nil if the telnet process will echo input.")
+(defvar-local telnet-interrupt-string "\C-c"
+  "String sent by C-c.")
 
 (defvar-local telnet-count 0
   "Number of output strings from telnet process while looking for password.")
@@ -106,7 +107,7 @@ rejecting one login and prompting again for a username and 
password.")
       (let (revert-buffer-function)
         (revert-buffer ignore-auto noconfirm))
     (if (or noconfirm
-            (yes-or-no-p (format "Restart connection? ")))
+            (yes-or-no-p "Restart connection? "))
         (apply telnet-connect-command))))
 
 (defun telnet-c-z ()
@@ -123,7 +124,7 @@ rejecting one login and prompting again for a username and 
password.")
 
 ;;maybe should have a flag for when have found type
 (defun telnet-check-software-type-initialize (string)
-  "Tries to put correct initializations in.  Needs work."
+  "Try to put correct initializations in.  Needs work."
   (let ((case-fold-search t))
     (cond ((string-match "unix" string)
         (setq telnet-prompt-pattern comint-prompt-regexp)
@@ -246,7 +247,7 @@ Normally input is edited in Emacs and sent a line at a 
time."
 
 (define-derived-mode telnet-mode comint-mode "Telnet"
   "This mode is for using telnet (or rsh) from a buffer to another host.
-It has most of the same commands as comint-mode.
+It has most of the same commands as `comint-mode'.
 There is a variable `telnet-interrupt-string' which is the character
 sent to try to stop execution of a job on the remote host.
 Data is sent to the remote host when RET is typed."
diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index 46064a8574..d68d4c7b76 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -1273,7 +1273,7 @@ connection if a previous connection has died for some 
reason."
                           (list "-s" device "shell")
                         (list "shell")))
                 (p (let ((default-directory
-                           (tramp-compat-temporary-file-directory)))
+                           tramp-compat-temporary-file-directory))
                      (apply #'start-process (tramp-get-connection-name vec) buf
                             tramp-adb-program args)))
                 (prompt (md5 (concat (prin1-to-string process-environment)
diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el
index 5e2e1f0602..b28235924d 100644
--- a/lisp/net/tramp-archive.el
+++ b/lisp/net/tramp-archive.el
@@ -658,7 +658,7 @@ offered."
   ;; mounted directory, it is returned as it.  Not what we want.
   (with-parsed-tramp-archive-file-name default-directory nil
     (let ((default-directory (file-name-directory archive)))
-      (tramp-compat-temporary-file-directory))))
+      (tramp-compat-temporary-file-directory-function))))
 
 (defun tramp-archive-handle-not-implemented (operation &rest args)
   "Generic handler for operations not implemented for file archives."
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
index bfd928731a..63eab1b31a 100644
--- a/lisp/net/tramp-cmds.el
+++ b/lisp/net/tramp-cmds.el
@@ -131,6 +131,8 @@ When called interactively, a Tramp connection has to be 
selected."
        (buf (list (get-buffer (tramp-buffer-name vec))
                   (unless keep-debug
                     (get-buffer (tramp-debug-buffer-name vec)))
+                  (unless keep-debug
+                    (get-buffer (tramp-trace-buffer-name vec)))
                   (tramp-get-connection-property vec "process-buffer" nil)))
       (when (bufferp buf) (kill-buffer buf)))
 
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index 125f82592f..213ab5857c 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -63,25 +63,24 @@
   `(when (functionp ,function)
      (with-no-warnings (funcall ,function ,@arguments))))
 
-(defsubst tramp-compat-temporary-file-directory ()
-  "Return name of directory for temporary files.
-It is the default value of `temporary-file-directory'."
-  ;; We must return a local directory.  If it is remote, we could run
-  ;; into an infloop.
-  (eval (car (get 'temporary-file-directory 'standard-value)) t))
+;; We must use a local directory.  If it is remote, we could run into
+;; an infloop.
+(defconst tramp-compat-temporary-file-directory
+  (eval (car (get 'temporary-file-directory 'standard-value)) t)
+  "The default value of `temporary-file-directory'.")
 
 (defsubst tramp-compat-make-temp-name ()
   "Generate a local temporary file name (compat function)."
   (make-temp-name
    (expand-file-name
-    tramp-temp-name-prefix (tramp-compat-temporary-file-directory))))
+    tramp-temp-name-prefix tramp-compat-temporary-file-directory)))
 
 (defsubst tramp-compat-make-temp-file (f &optional dir-flag)
   "Create a local temporary file (compat function).
 Add the extension of F, if existing."
   (make-temp-file
    (expand-file-name
-    tramp-temp-name-prefix (tramp-compat-temporary-file-directory))
+    tramp-temp-name-prefix tramp-compat-temporary-file-directory)
    dir-flag (file-name-extension f t)))
 
 ;; `temporary-file-directory' as function is introduced with Emacs 26.1.
@@ -359,10 +358,10 @@ CONDITION can also be a list of error conditions."
 (defalias 'tramp-compat-string-replace
   (if (fboundp 'string-replace)
       #'string-replace
-    (lambda (fromstring tostring instring)
+    (lambda (from-string to-string in-string)
       (let ((case-fold-search nil))
         (replace-regexp-in-string
-         (regexp-quote fromstring) tostring instring t t)))))
+         (regexp-quote from-string) to-string in-string t t)))))
 
 ;; Function `string-search' is new in Emacs 28.1.
 (defalias 'tramp-compat-string-search
diff --git a/lisp/net/tramp-crypt.el b/lisp/net/tramp-crypt.el
index 5f86767ef9..5def3a4137 100644
--- a/lisp/net/tramp-crypt.el
+++ b/lisp/net/tramp-crypt.el
@@ -247,7 +247,7 @@ Operations not mentioned here will be handled by the 
default Emacs primitives.")
     (unless (tramp-crypt-file-name-p tfnfo)
       (setq tfnfo (apply
                   #'tramp-file-name-for-operation operation
-                  (cons (tramp-compat-temporary-file-directory) (cdr args)))))
+                  (cons tramp-compat-temporary-file-directory (cdr args)))))
     tfnfo))
 
 (defun tramp-crypt-run-real-handler (operation args)
@@ -329,7 +329,7 @@ connection if a previous connection has died for some 
reason."
          (copy-file remote-config local-config 'ok 'keep)
 
        ;; Create local encfs6 config file otherwise.
-       (let* ((default-directory (tramp-compat-temporary-file-directory))
+       (let* ((default-directory tramp-compat-temporary-file-directory)
               (tmpdir1 (file-name-as-directory
                         (tramp-compat-make-temp-file " .crypt" 'dir-flag)))
               (tmpdir2 (file-name-as-directory
@@ -383,7 +383,7 @@ ARGS are the arguments.  It returns t if ran successful, 
and nil otherwise."
   (with-temp-buffer
     (let* (;; Don't check for a proper method.
           (non-essential t)
-          (default-directory (tramp-compat-temporary-file-directory))
+          (default-directory tramp-compat-temporary-file-directory)
           ;; We cannot add it to `process-environment', because
           ;; `tramp-call-process-region' doesn't use it.
           (encfs-config
@@ -427,7 +427,7 @@ Otherwise, return NAME."
              crypt-vec localname (concat (symbol-name op) "-file-name")
            (unless (tramp-crypt-send-command
                     crypt-vec (if (eq op 'encrypt) "encode" "decode")
-                    (tramp-compat-temporary-file-directory) localname)
+                    tramp-compat-temporary-file-directory localname)
              (tramp-error
               crypt-vec 'file-error "%s of file name %s failed."
               (if (eq op 'encrypt) "Encoding" "Decoding") name))
diff --git a/lisp/net/tramp-fuse.el b/lisp/net/tramp-fuse.el
index 93b184a36c..8c5afa7cf9 100644
--- a/lisp/net/tramp-fuse.el
+++ b/lisp/net/tramp-fuse.el
@@ -154,7 +154,7 @@
        (when (tramp-file-name-user vec)
          (concat (tramp-file-name-user-domain vec) "@"))
        (tramp-file-name-host-port vec))
-       (tramp-compat-temporary-file-directory))))
+       tramp-compat-temporary-file-directory)))
 
 (defun tramp-fuse-mounted-p (vec)
   "Check, whether fuse volume determined by VEC is mounted."
@@ -163,7 +163,7 @@
     ;; to cache a nil result.
     (or (tramp-get-connection-property
          (tramp-get-connection-process vec) "mounted" nil)
-        (let* ((default-directory (tramp-compat-temporary-file-directory))
+        (let* ((default-directory tramp-compat-temporary-file-directory)
                (command (format "mount -t fuse.%s" (tramp-file-name-method 
vec)))
               (mount (shell-command-to-string command)))
           (tramp-message vec 6 "%s\n%s" command mount)
@@ -177,7 +177,7 @@
 
 (defun tramp-fuse-unmount (vec)
   "Unmount fuse volume determined by VEC."
-  (let ((default-directory (tramp-compat-temporary-file-directory))
+  (let ((default-directory tramp-compat-temporary-file-directory)
         (command (format "fusermount3 -u %s" (tramp-fuse-mount-point vec))))
     (tramp-message vec 6 "%s\n%s" command (shell-command-to-string command))
     (tramp-flush-connection-property
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index fbb122e721..7f1a52fa93 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -2391,7 +2391,7 @@ The method used must be an out-of-band method."
                 ;; can be handled.  We don't set a timeout, because
                 ;; the copying of large files can last longer than 60
                 ;; secs.
-                p (let ((default-directory 
(tramp-compat-temporary-file-directory)))
+                p (let ((default-directory 
tramp-compat-temporary-file-directory))
                     (apply
                      #'start-process
                      (tramp-get-connection-name v)
@@ -2740,7 +2740,7 @@ the result will be a local, non-Tramp, file name."
        ;; `expand-file-name' (this does "/./" and "/../").
        ;; `default-directory' is bound, because on Windows there
        ;; would be problems with UNC shares or Cygwin mounts.
-       (let ((default-directory (tramp-compat-temporary-file-directory)))
+       (let ((default-directory tramp-compat-temporary-file-directory))
          (tramp-make-tramp-file-name
           v (tramp-drop-volume-letter
              (tramp-run-real-handler
@@ -2883,10 +2883,14 @@ implementation will be used."
 
            ;; Handle error buffer.
            (when (bufferp stderr)
+             (unless (tramp-get-remote-mknod-or-mkfifo v)
+               (tramp-error
+                v 'file-error "Stderr buffer `%s' not supported" stderr))
              (with-current-buffer stderr
                (setq buffer-read-only nil))
              ;; Create named pipe.
-             (tramp-send-command v (format "mknod %s p" tmpstderr))
+             (tramp-send-command
+              v (format (tramp-get-remote-mknod-or-mkfifo v) tmpstderr))
              ;; Create stderr process.
              (make-process
               :name (buffer-name stderr)
@@ -2963,7 +2967,7 @@ implementation will be used."
                        (ignore-errors
                          (set-process-query-on-exit-flag p (null noquery))
                          (set-marker (process-mark p) (point)))
-                       ;; Kill stderr process delete and named pipe.
+                       ;; Kill stderr process and delete named pipe.
                        (when (bufferp stderr)
                          (add-function
                           :after (process-sentinel p)
@@ -3221,7 +3225,7 @@ implementation will be used."
                  (let (file-name-handler-alist
                        (coding-system-for-write 'binary)
                        (default-directory
-                         (tramp-compat-temporary-file-directory)))
+                         tramp-compat-temporary-file-directory))
                    (with-temp-file tmpfile
                      (set-buffer-multibyte nil)
                      (insert-buffer-substring (tramp-get-buffer v))
@@ -3314,8 +3318,7 @@ implementation will be used."
               ;; we use it always because this makes the logic
               ;; simpler.  We must also set `temporary-file-directory',
               ;; because it could point to a remote directory.
-              (temporary-file-directory
-               (tramp-compat-temporary-file-directory))
+              (temporary-file-directory tramp-compat-temporary-file-directory)
               (tmpfile (or tramp-temp-buffer-file-name
                            (tramp-compat-make-temp-file filename))))
 
@@ -3408,7 +3411,7 @@ implementation will be used."
                          ;; question is a tmp file anyway.
                          (let ((coding-system-for-read 'binary)
                                (default-directory
-                                 (tramp-compat-temporary-file-directory)))
+                                 tramp-compat-temporary-file-directory))
                            (insert-file-contents-literally tmpfile)
                            (funcall loc-enc (point-min) (point-max)))
 
@@ -4919,7 +4922,7 @@ connection if a previous connection has died for some 
reason."
                     ;; This must be done in order to avoid our file
                     ;; name handler.
                     (p (let ((default-directory
-                               (tramp-compat-temporary-file-directory)))
+                               tramp-compat-temporary-file-directory))
                          (apply
                           #'start-process
                           (tramp-get-connection-name vec)
@@ -5797,6 +5800,23 @@ This command is returned only if 
`delete-by-moving-to-trash' is non-nil."
            (tramp-file-local-name tmpfile) (tramp-file-local-name tmpfile)))
        (delete-file tmpfile)))))
 
+(defun tramp-get-remote-mknod-or-mkfifo (vec)
+  "Determine remote `mknod' or `mkfifo' command."
+  (with-tramp-connection-property vec "mknod-or-mkfifo"
+    (tramp-message vec 5 "Finding a suitable `mknod' or `mkfifo' command")
+    (let ((tmpfile (tramp-make-tramp-temp-name vec))
+         command)
+      (prog1
+         (or (and (setq command "mknod %s p")
+                  (tramp-send-command-and-check
+                   vec (format command (tramp-file-local-name tmpfile)))
+                  command)
+             (and (setq command "mkfifo %s")
+                  (tramp-send-command-and-check
+                   vec (format command (tramp-file-local-name tmpfile)))
+                  command))
+       (delete-file tmpfile)))))
+
 ;; Some predefined connection properties.
 (defun tramp-get-inline-compress (vec prop size)
   "Return the compress command related to PROP.
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index 5c2d7d008a..87f3665d91 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -1962,7 +1962,7 @@ If ARGUMENT is non-nil, use it as argument for
     ;; Otherwise, we must delete the connection cache, because
     ;; capabilities might have changed.
     (unless (or argument (processp p))
-      (let ((default-directory (tramp-compat-temporary-file-directory))
+      (let ((default-directory tramp-compat-temporary-file-directory)
            (command (concat tramp-smb-program " -V")))
 
        (unless tramp-smb-version
@@ -2049,7 +2049,7 @@ If ARGUMENT is non-nil, use it as argument for
            (let* ((coding-system-for-read nil)
                   (process-connection-type tramp-process-connection-type)
                   (p (let ((default-directory
-                             (tramp-compat-temporary-file-directory))
+                             tramp-compat-temporary-file-directory)
                            (process-environment
                             (cons (concat "TERM=" tramp-terminal-type)
                                   process-environment)))
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 93ec8d6934..2804b4d37d 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -183,7 +183,7 @@ See the variable `tramp-encoding-shell' for more 
information."
   :version "24.1"
   :type '(choice (const nil) string))
 
-;; Since Emacs 26.1, `system-name' can return `nil' at build time if
+;; Since Emacs 26.1, `system-name' can return nil at build time if
 ;; Emacs is compiled with "--no-build-details".  We do expect it to be
 ;; a string.  (Bug#44481)
 (defconst tramp-system-name (or (system-name) "")
@@ -1899,7 +1899,7 @@ The outline level is equal to the verbosity of the Tramp 
message."
       ;; `(custom-declare-variable outline-minor-mode-prefix ...)'
       ;; raises on error in `(outline-mode)', we don't want to see it
       ;; in the traces.
-      (let ((default-directory (tramp-compat-temporary-file-directory)))
+      (let ((default-directory tramp-compat-temporary-file-directory))
        (outline-mode))
       (setq-local outline-level 'tramp-debug-outline-level)
       (setq-local font-lock-keywords
@@ -1918,7 +1918,7 @@ The outline level is equal to the verbosity of the Tramp 
message."
   "Get the debug file name for VEC."
   (expand-file-name
    (tramp-compat-string-replace "/" " " (tramp-debug-buffer-name vec))
-   (tramp-compat-temporary-file-directory)))
+   tramp-compat-temporary-file-directory))
 
 (put #'tramp-get-debug-file-name 'tramp-suppress-trace t)
 
@@ -1960,7 +1960,8 @@ ARGUMENTS to actually emit the message (if applicable)."
            (dolist
                (elt
                 (append
-                 (mapcar #'intern (all-completions "tramp-" obarray 
'functionp))
+                 (mapcar
+                  #'intern (all-completions "tramp-" obarray #'functionp))
                  tramp-trace-functions))
              (unless (get elt 'tramp-suppress-trace)
                (trace-function-background elt))))
@@ -2586,7 +2587,7 @@ Fall back to normal file name handler if no Tramp file 
name handler exists."
                           ;; the bug#9114 for which it was added doesn't
                           ;; clarify the core of the problem.
                          (let ((default-directory
-                                 (tramp-compat-temporary-file-directory))
+                                  tramp-compat-temporary-file-directory)
                                file-name-handler-alist)
                            (autoload-do-load sf foreign)))
                         ;; (tramp-message
@@ -3090,7 +3091,7 @@ User is always nil."
 User is always nil."
   ;; On Windows, there are problems in completion when
   ;; `default-directory' is remote.
-  (let ((default-directory (tramp-compat-temporary-file-directory)))
+  (let ((default-directory tramp-compat-temporary-file-directory))
     (when (file-readable-p filename)
       (with-temp-buffer
        (insert-file-contents-literally filename)
@@ -3144,7 +3145,7 @@ User is always nil."
 User is always nil."
   ;; On Windows, there are problems in completion when
   ;; `default-directory' is remote.
-  (let* ((default-directory (tramp-compat-temporary-file-directory))
+  (let* ((default-directory tramp-compat-temporary-file-directory)
         (files (and (file-directory-p dirname) (directory-files dirname))))
     (cl-loop
      for f in files
@@ -3378,7 +3379,7 @@ User is always nil."
       ;; Do normal `expand-file-name' (this does "/./" and "/../").
       ;; `default-directory' is bound, because on Windows there would
       ;; be problems with UNC shares or Cygwin mounts.
-      (let ((default-directory (tramp-compat-temporary-file-directory)))
+      (let ((default-directory tramp-compat-temporary-file-directory))
        (tramp-make-tramp-file-name
         v (tramp-drop-volume-letter
            (tramp-run-real-handler #'expand-file-name (list localname))))))))
@@ -4103,7 +4104,7 @@ substitution.  SPEC-LIST is a list of char/value pairs 
used for
   "An alternative `make-process' implementation for Tramp files."
   (when args
     (with-parsed-tramp-file-name (expand-file-name default-directory) nil
-      (let ((default-directory (tramp-compat-temporary-file-directory))
+      (let ((default-directory tramp-compat-temporary-file-directory)
            (name (plist-get args :name))
            (buffer (plist-get args :buffer))
            (command (plist-get args :command))
@@ -5366,7 +5367,7 @@ This handles also chrooted environments, which are not 
regarded as local."
      ;; The local temp directory must be writable for the other user.
      (file-writable-p
       (tramp-make-tramp-file-name
-       vec (tramp-compat-temporary-file-directory) 'nohop))
+       vec tramp-compat-temporary-file-directory 'nohop))
      ;; On some systems, chown runs only for root.
      (or (zerop (user-uid))
         (zerop (tramp-get-remote-uid vec 'integer))))))
@@ -5508,7 +5509,7 @@ ALIST is of the form ((FROM . TO) ...)."
 It always returns a return code.  The Lisp error raised when
 PROGRAM is nil is trapped also, returning 1.  Furthermore, traces
 are written with verbosity of 6."
-  (let ((default-directory (tramp-compat-temporary-file-directory))
+  (let ((default-directory tramp-compat-temporary-file-directory)
        (process-environment (default-toplevel-value 'process-environment))
        (destination (if (eq destination t) (current-buffer) destination))
        (vec (or vec (car tramp-current-connection)))
@@ -5542,7 +5543,7 @@ are written with verbosity of 6."
 It always returns a return code.  The Lisp error raised when
 PROGRAM is nil is trapped also, returning 1.  Furthermore, traces
 are written with verbosity of 6."
-  (let ((default-directory (tramp-compat-temporary-file-directory))
+  (let ((default-directory tramp-compat-temporary-file-directory)
        (process-environment (default-toplevel-value 'process-environment))
        (buffer (if (eq buffer t) (current-buffer) buffer))
        result)
@@ -5572,7 +5573,7 @@ are written with verbosity of 6."
   "Call `process-lines' on the local host.
 If an error occurs, it returns nil.  Traces are written with
 verbosity of 6."
-  (let ((default-directory (tramp-compat-temporary-file-directory))
+  (let ((default-directory tramp-compat-temporary-file-directory)
        (process-environment (default-toplevel-value 'process-environment))
        (vec (or vec (car tramp-current-connection)))
        result)
@@ -5611,7 +5612,7 @@ Invokes `password-read' if available, `read-passwd' else."
         ;; `exec-path' contains a relative file name like ".", it
         ;; could happen that the "gpg" command is not found.  So we
         ;; adapt `default-directory'.  (Bug#39389, Bug#39489)
-        (default-directory (tramp-compat-temporary-file-directory))
+        (default-directory tramp-compat-temporary-file-directory)
         (case-fold-search t)
         (key (tramp-make-tramp-file-name
               ;; In tramp-sh.el, we must use "password-vector" due to
@@ -5677,6 +5678,10 @@ Invokes `password-read' if available, `read-passwd' 
else."
               ;; Else, get the password interactively w/o cache.
               (read-passwd pw-prompt))
 
+           ;; Workaround.  Prior Emacs 28.1, auth-source has saved
+           ;; empty passwords.  See discussion in Bug#50399.
+           (when (zerop (length auth-passwd))
+             (setq tramp-password-save-function nil))
            (tramp-set-connection-property v "first-password-request" nil)))
 
       ;; Reenable the timers.
diff --git a/lisp/nxml/nxml-mode.el b/lisp/nxml/nxml-mode.el
index c5c9dfb2af..98ce1d6993 100644
--- a/lisp/nxml/nxml-mode.el
+++ b/lisp/nxml/nxml-mode.el
@@ -455,8 +455,9 @@ reference.")
   ;; because Emacs turns C-c C-i into C-c TAB which is hard to type and
   ;; not mnemonic.
   "Major mode for editing XML.
-
+\\<nxml-mode-map>
 \\[nxml-finish-element] finishes the current element by inserting an end-tag.
+
 C-c C-i closes a start-tag with `>' and then inserts a balancing end-tag
 leaving point between the start-tag and end-tag.
 \\[nxml-balanced-close-start-tag-block] is similar but for block rather than 
inline elements:
diff --git a/lisp/nxml/rng-loc.el b/lisp/nxml/rng-loc.el
index a38da79422..c8b19e8c22 100644
--- a/lisp/nxml/rng-loc.el
+++ b/lisp/nxml/rng-loc.el
@@ -501,7 +501,7 @@ saved to the first writable file in 
`rng-schema-locating-files'."
               nil
             (error "Buffer does not have a filename")))
          ((and prompt
-               (not (y-or-n-p (format "Save %s to %s "
+                (not (y-or-n-p (format "Save %s to %s?"
                                       (if type-id
                                           "type identifier"
                                         "schema location")
@@ -539,7 +539,7 @@ saved to the first writable file in 
`rng-schema-locating-files'."
                                       locating-file-uri))))))
               (indent-according-to-mode)
               (when (or (not modified)
-                        (y-or-n-p (format "Save file %s "
+                         (y-or-n-p (format "Save file %s?"
                                           (buffer-file-name))))
                 (save-buffer))))))))
 
diff --git a/lisp/nxml/rng-valid.el b/lisp/nxml/rng-valid.el
index fca666115a..9df20a16b1 100644
--- a/lisp/nxml/rng-valid.el
+++ b/lisp/nxml/rng-valid.el
@@ -962,9 +962,8 @@ Return nil at end of buffer, t otherwise."
     (and type t)))
 
 (defun rng-process-start-tag (tag-type)
-  "TAG-TYPE is `start-tag' for a start-tag, `empty-element' for
-an empty element.  `partial-empty-element' should be passed
-as empty-element."
+  "TAG-TYPE is `start-tag' for a start-tag, `empty-element' for an empty 
element.
+`partial-empty-element' should be passed as empty-element."
   (and rng-collecting-text (rng-flush-text))
   (setq rng-collecting-text nil)
   (setq rng-pending-contents nil)
diff --git a/lisp/org/org-agenda.el b/lisp/org/org-agenda.el
index 3acc18715d..23c62809a2 100644
--- a/lisp/org/org-agenda.el
+++ b/lisp/org/org-agenda.el
@@ -4531,7 +4531,7 @@ is active."
                      'org-todo-regexp org-todo-regexp
                      'org-complex-heading-regexp org-complex-heading-regexp
                      'mouse-face 'highlight
-                     'help-echo (format "mouse-2 or RET jump to location")))
+                     'help-echo "mouse-2 or RET jump to location"))
         (full-words org-agenda-search-view-force-full-words)
         (org-agenda-text-search-extra-files org-agenda-text-search-extra-files)
         regexp rtn rtnall files file pos inherited-tags
@@ -8842,7 +8842,7 @@ Point is in the buffer where the item originated.")
 
 (defun org-agenda-do-in-region (beg end cmd &optional arg force-arg delete)
   "Between region BEG and END, call agenda command CMD.
-When optional argument ARG is non-nil or FORCE-ARG is `t', pass
+When optional argument ARG is non-nil or FORCE-ARG is t, pass
 ARG to CMD.  When optional argument DELETE is non-nil, assume CMD
 deletes the agenda entry and don't move to the next entry."
   (save-excursion
diff --git a/lisp/org/ox-html.el b/lisp/org/ox-html.el
index 03145e35c5..d8932996eb 100644
--- a/lisp/org/ox-html.el
+++ b/lisp/org/ox-html.el
@@ -874,7 +874,7 @@ link's path."
 (defcustom org-html-htmlize-output-type 'inline-css
   "Output type to be used by htmlize when formatting code snippets.
 Choices are `css' to export the CSS selectors only,`inline-css'
-to export the CSS attribute values inline in the HTML or `nil' to
+to export the CSS attribute values inline in the HTML or nil to
 export plain text.  We use as default `inline-css', in order to
 make the resulting HTML self-containing.
 
diff --git a/lisp/outline.el b/lisp/outline.el
index 0bb74ffd64..52a94b4d9f 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -175,23 +175,45 @@ in the file it applies to.")
                                   outline-mode-menu-bar-map))))))
     map))
 
-(defvar outline-mode-cycle-map
+(defcustom outline-minor-mode-cycle-filter nil
+  "Filter out positions on the heading available for cycling."
+  :type '(choice (const :tag "Everywhere" nil)
+                 (const :tag "At line beginning" bolp)
+                 (const :tag "Not at line beginning"
+                        (lambda () (not (bolp))))
+                 (const :tag "At line end" eolp)
+                 (function :tag "Custom filter"))
+  :version "28.1")
+
+(defun outline-minor-mode-cycle--bind (map key binding &optional filter)
+  (define-key map key
+    `(menu-item
+      "" ,binding
+      ;; Filter out specific positions on the heading.
+      :filter
+      ,(or filter
+           (lambda (cmd)
+             (when (or (not (functionp outline-minor-mode-cycle-filter))
+                       (funcall outline-minor-mode-cycle-filter))
+               cmd))))))
+
+(defvar outline-minor-mode-cycle-map
   (let ((map (make-sparse-keymap)))
-    (let ((tab-binding `(menu-item
-                         "" outline-cycle
-                         ;; Only takes effect if point is on a heading.
-                         :filter ,(lambda (cmd)
-                                    (when (outline-on-heading-p) cmd)))))
-      (define-key map (kbd "TAB") tab-binding)
-      (define-key map (kbd "<backtab>") #'outline-cycle-buffer))
+    (outline-minor-mode-cycle--bind map (kbd "TAB") #'outline-cycle)
+    (outline-minor-mode-cycle--bind map (kbd "<backtab>") 
#'outline-cycle-buffer)
     map)
-  "Keymap used by `outline-mode-map' and `outline-minor-mode-cycle'.")
+  "Keymap used by `outline-minor-mode-cycle'.")
 
 (defvar outline-mode-map
   (let ((map (make-sparse-keymap)))
-    (set-keymap-parent map outline-mode-cycle-map)
     (define-key map "\C-c" outline-mode-prefix-map)
     (define-key map [menu-bar] outline-mode-menu-bar-map)
+    ;; Only takes effect if point is on a heading.
+    (define-key map (kbd "TAB")
+      `(menu-item "" outline-cycle
+                  :filter ,(lambda (cmd)
+                             (when (outline-on-heading-p) cmd))))
+    (define-key map (kbd "<backtab>") #'outline-cycle-buffer)
     map))
 
 (defvar outline-font-lock-keywords
@@ -202,9 +224,9 @@ in the file it applies to.")
                          (if outline-minor-mode-cycle
                              (if outline-minor-mode-highlight
                                  (list 'face (outline-font-lock-face)
-                                       'keymap outline-mode-cycle-map)
+                                       'keymap outline-minor-mode-cycle-map)
                                (list 'face nil
-                                     'keymap outline-mode-cycle-map))
+                                     'keymap outline-minor-mode-cycle-map))
                            (if outline-minor-mode-highlight
                                (list 'face (outline-font-lock-face))))
                        (outline-font-lock-face))
@@ -367,7 +389,7 @@ faces to major mode's faces."
                          (not (get-text-property (point) 'face))))
             (overlay-put overlay 'face (outline-font-lock-face)))
           (when outline-minor-mode-cycle
-            (overlay-put overlay 'keymap outline-mode-cycle-map)))
+            (overlay-put overlay 'keymap outline-minor-mode-cycle-map)))
         (goto-char (match-end 0))))))
 
 ;;;###autoload
diff --git a/lisp/pcmpl-x.el b/lisp/pcmpl-x.el
index fd147101b6..d9479edf6a 100644
--- a/lisp/pcmpl-x.el
+++ b/lisp/pcmpl-x.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (eval-when-compile (require 'cl-lib))
diff --git a/lisp/play/5x5.el b/lisp/play/5x5.el
index 1d19330629..085c97f5d8 100644
--- a/lisp/play/5x5.el
+++ b/lisp/play/5x5.el
@@ -387,7 +387,7 @@ Mutate the result."
 (defun 5x5-crack (breeder)
   "Attempt to find a solution for 5x5.
 
-5x5-crack takes the argument BREEDER which should be a function that takes
+`5x5-crack' takes the argument BREEDER which should be a function that takes
 two parameters, the first will be a grid vector array that is the current
 solution and the second will be the best solution so far.  The function
 should return a grid vector array that is the new solution."
@@ -474,8 +474,8 @@ position."
                grid)))
 
 (defun 5x5-vec-to-grid (grid-matrix)
-  "Convert a grid matrix GRID-MATRIX in Calc format to a grid in
-5x5 format.  See function `5x5-grid-to-vec'."
+  "Convert a grid matrix GRID-MATRIX in Calc format to a grid in 5x5 format.
+See function `5x5-grid-to-vec'."
   (apply
    #'vector
    (mapcar
diff --git a/lisp/play/doctor.el b/lisp/play/doctor.el
index 9777fc3ea2..b855f7e35a 100644
--- a/lisp/play/doctor.el
+++ b/lisp/play/doctor.el
@@ -115,7 +115,7 @@
 (defun doc// (x) x)
 
 (defmacro doc$ (what)
-  "Quoted arg form of doctor-$."
+  "Quoted arg form of `doctor-$'."
   `(doctor-$ ',what))
 
 (defun doctor-$ (what)
@@ -1011,7 +1011,7 @@ Put dialogue in buffer."
 
 (defun doctor-subjsearch (sent key type)
   "Search for the subject of a sentence SENT, looking for the noun closest
-to and preceding KEY by at least TYPE words.  Set global variable doctor-subj 
to
+to and preceding KEY by at least TYPE words.  Set global variable 
`doctor-subj' to
 the subject noun, and return the portion of the sentence following it."
   (let ((i (- (length sent) (length (memq key sent)) type)))
     (while (and (> i -1) (not (doctor-nounp (nth i sent))))
diff --git a/lisp/play/dunnet.el b/lisp/play/dunnet.el
index d9acad8e43..706c1be81e 100644
--- a/lisp/play/dunnet.el
+++ b/lisp/play/dunnet.el
@@ -944,8 +944,8 @@ handled specially by 'dun-describe-room.")
        (list obj-pc)                          ;; pc-area
        nil nil nil nil nil nil
        )
-  "These are objects in a room that are only described in the
-room description.  They are permanent.")
+  "These are objects in a room that are only described in the room description.
+They are permanent.")
 (defvar dun-inventory '(1))
 
 (defconst dun-objects
@@ -1010,8 +1010,7 @@ the inventory.")
     nil nil
     ("There is a bus here.")
     nil nil nil)
-  "These are the descriptions for the negative numbered objects from
-`dun-room-objects'.")
+  "Descriptions for the negative numbered objects from `dun-room-objects'.")
 
 
 (defconst dun-physobj-desc '(
@@ -1216,8 +1215,9 @@ Otherwise short.  Also give long if we were called with 
negative room number."
        (dun-mprincl "You are on the bus."))))
 
 (defun dun-special-object ()
-  "There is a special object in the room.  This object's description,
-or lack thereof, depends on certain conditions."
+  "There is a special object in the room.
+This object's description, or lack thereof, depends on certain
+conditions."
   (cond
    ((= dun-current-room computer-room)
     (if dun-computer
diff --git a/lisp/play/hanoi.el b/lisp/play/hanoi.el
index d3d0ad1309..227dd790af 100644
--- a/lisp/play/hanoi.el
+++ b/lisp/play/hanoi.el
@@ -133,7 +133,7 @@ Repent before ring 31 moves."
 (defun hanoi-unix-64 ()
   "Like `hanoi-unix', but pretend to have a 64-bit clock.
 This is, necessarily (as of Emacs 20.3), a crock.  When the
-current-time interface is made s2G-compliant, hanoi.el will need
+`current-time' interface is made s2G-compliant, hanoi.el will need
 to be updated."
   (interactive)
   (let* ((start (ftruncate (float-time)))
diff --git a/lisp/play/mpuz.el b/lisp/play/mpuz.el
index 5ac1d7c60c..ff174fed6c 100644
--- a/lisp/play/mpuz.el
+++ b/lisp/play/mpuz.el
@@ -119,7 +119,7 @@ You may abort a game by typing 
\\<mpuz-mode-map>\\[mpuz-offer-abort]."
 ;; Some variables for game tracking
 ;;---------------------------------
 (defvar mpuz-in-progress nil
-  "True if a game is currently in progress.")
+  "Non-nil if a game is currently in progress.")
 
 (defvar mpuz-found-digits (make-bool-vector 10 nil)
   "A vector recording which digits have been decrypted.")
diff --git a/lisp/play/tetris.el b/lisp/play/tetris.el
index f43aa47326..3d6ddd5307 100644
--- a/lisp/play/tetris.el
+++ b/lisp/play/tetris.el
@@ -620,7 +620,7 @@ Shapes drop from the top of the screen, and the user has to 
move and
 rotate the shape to fit in with those at the bottom of the screen so
 as to form complete rows.
 
-tetris-mode keybindings:
+`tetris-mode' keybindings:
 \\<tetris-mode-map>
 \\[tetris-start-game]  Start a new game of Tetris
 \\[tetris-end-game]    Terminate the current game
diff --git a/lisp/printing.el b/lisp/printing.el
index 89e49ccb2a..fb718f9aa6 100644
--- a/lisp/printing.el
+++ b/lisp/printing.el
@@ -1672,7 +1672,7 @@ DEFAULT           It's a way to set default values when 
this entry is selected.
 
                   (set VARIABLE (eval VALUE))
 
-               Note that VALUE can be any valid lisp expression.  So, don't
+                Note that VALUE can be any valid Lisp expression.  So, don't
                forget to quote symbols and constant lists.
                If VARIABLE is the special keyword `inherits-from:', VALUE must
                be a symbol name setting defined in `pr-setting-database' from
@@ -1772,8 +1772,7 @@ Useful links:
   `https://linux.die.net/man/1/lp'
 
 * GNU utilities for w32 (cp.exe)
-  `http://unxutils.sourceforge.net/'
-"
+  `http://unxutils.sourceforge.net/'"
   :type '(repeat
          (list
           :tag "PostScript Printer"
@@ -2181,7 +2180,7 @@ DEFAULT           It's a way to set default values when 
this entry is selected.
 
                   (set (make-local-variable VARIABLE-SYM) (eval VALUE))
 
-               Note that VALUE can be any valid lisp expression.  So, don't
+                Note that VALUE can be any valid Lisp expression.  So, don't
                forget to quote symbols and constant lists.
                If VARIABLE is the special keyword `inherits-from:', VALUE must
                be a symbol name setting defined in `pr-setting-database' from
@@ -2413,8 +2412,7 @@ Useful links:
 
 * GNU Enscript documentation (Windows, GNU or Unix)
   `https://people.ssh.com/mtr/genscript/enscript.man.html'
-  (on GNU or Unix, type `man enscript')
-"
+  (on GNU or Unix, type `man enscript')"
   :type '(repeat
          (list :tag "PS File Utility"
                (symbol :tag "Utility Symbol")
@@ -4276,7 +4274,7 @@ printed using `pr-ps-mode-ps-print'.
 
 Interactively, you have the following situations:
 
-   M-x pr-ps-fast-fire RET
+   \\[pr-ps-fast-fire]
       The command prompts the user for a N-UP value and printing will
       immediately be done using the current active printer.
 
diff --git a/lisp/profiler.el b/lisp/profiler.el
index 0b456bb3e3..fa74fe8de2 100644
--- a/lisp/profiler.el
+++ b/lisp/profiler.el
@@ -105,8 +105,8 @@
 ;;; Entries
 
 (defun profiler-format-entry (entry)
-  "Format ENTRY in human readable string.  ENTRY would be a
-function name of a function itself."
+  "Format ENTRY in human readable string.
+ENTRY would be a function name of a function itself."
   (cond ((memq (car-safe entry) '(closure lambda))
         (format "#<lambda %#x>" (sxhash entry)))
        ((byte-code-function-p entry)
@@ -463,7 +463,7 @@ Optional argument MODE means only check for the specified 
mode (cpu or mem)."
   "The current profile.")
 
 (defvar-local profiler-report-reversed nil
-  "True if calltree is rendered in bottom-up.
+  "Non-nil if calltree is rendered in bottom-up.
 Do not touch this variable directly.")
 
 (defvar-local profiler-report-order nil
diff --git a/lisp/progmodes/autoconf.el b/lisp/progmodes/autoconf.el
index 73cf290f43..78148ccf85 100644
--- a/lisp/progmodes/autoconf.el
+++ b/lisp/progmodes/autoconf.el
@@ -44,7 +44,7 @@
   
"A\\(?:H_TEMPLATE\\|C_\\(?:SUBST\\|DEFINE\\(?:_UNQUOTED\\)?\\)\\)(\\[*\\(\\(?:\\sw\\|\\s_\\)+\\)\\]*")
 
 (defvar autoconf-font-lock-keywords
-  `(("\\_<A[CHMS]_\\(?:\\sw\\|\\s_\\)+" . font-lock-keyword-face)
+  `(("\\_<\\(?:A[CHMS]\\|LT\\)_\\(?:\\sw\\|\\s_\\)+" . font-lock-keyword-face)
     (,autoconf-definition-regexp
      1 font-lock-function-name-face)
     ;; Are any other M4 keywords really appropriate for configure.ac,
diff --git a/lisp/progmodes/bug-reference.el b/lisp/progmodes/bug-reference.el
index b646a47c85..fd014a38d9 100644
--- a/lisp/progmodes/bug-reference.el
+++ b/lisp/progmodes/bug-reference.el
@@ -376,24 +376,19 @@ URL-REGEXP against the VCS URL and returns the value to 
be set as
 Test each configuration in `bug-reference-setup-from-vc-alist'
 and `bug-reference--setup-from-vc-alist' and apply it if
 applicable."
-  (let ((file-or-dir (or buffer-file-name
-                         ;; Catches modes such as vc-dir and Magit.
-                         default-directory)))
-    (when file-or-dir
-      (let* ((backend (vc-responsible-backend file-or-dir t))
-             (url
-              (or (ignore-errors
-                    (vc-call-backend backend 'repository-url "upstream"))
-                  (ignore-errors
-                    (vc-call-backend backend 'repository-url)))))
-        (when url
-          (catch 'found
-            (dolist (config (append
-                             bug-reference-setup-from-vc-alist
-                             (bug-reference--setup-from-vc-alist)))
-              (when (apply #'bug-reference-maybe-setup-from-vc
-                           url config)
-                (throw 'found t)))))))))
+  (when-let ((file-or-dir (or buffer-file-name
+                              ;; Catches modes such as vc-dir and Magit.
+                              default-directory))
+             (backend (vc-responsible-backend file-or-dir t))
+             (url (seq-some (lambda (remote)
+                              (ignore-errors
+                                (vc-call-backend backend 'repository-url
+                                                 file-or-dir remote)))
+                            '("upstream" nil))))
+    (seq-some (lambda (config)
+                (apply #'bug-reference-maybe-setup-from-vc url config))
+              (append bug-reference-setup-from-vc-alist
+                      (bug-reference--setup-from-vc-alist)))))
 
 (defvar bug-reference-setup-from-mail-alist
   `((,(regexp-opt '("emacs" "auctex" "gnus" "tramp" "orgmode") 'words)
diff --git a/lisp/progmodes/cc-bytecomp.el b/lisp/progmodes/cc-bytecomp.el
index f07f18678a..b6805898b0 100644
--- a/lisp/progmodes/cc-bytecomp.el
+++ b/lisp/progmodes/cc-bytecomp.el
@@ -339,8 +339,8 @@ should be a string.  CONDITION should not be quoted."
     '(progn)))
 
 (defmacro cc-provide (feature)
-  "A replacement for the `provide' form that restores the environment
-after the compilation.  Don't use within `eval-when-compile'."
+  "A replacement for `provide' that restores the environment after the 
compilation.
+Don't use within `eval-when-compile'."
   (declare (debug t))
   `(progn
      (eval-when-compile (cc-bytecomp-restore-environment))
@@ -381,8 +381,9 @@ afterwards.  Don't use within `eval-when-compile'."
      (eval-when-compile (cc-bytecomp-setup-environment))))
 
 (defmacro cc-bytecomp-defvar (var)
-  "Bind the symbol as a variable during compilation of the file,
-to silence the byte compiler.  Don't use within `eval-when-compile'."
+  "Bind the symbol VAR as a variable during compilation of the file.
+This can be used to silence the byte compiler.  Don't use within
+`eval-when-compile'."
   (declare (debug nil))
   `(eval-when-compile
      (if (boundp ',var)
@@ -403,8 +404,9 @@ to silence the byte compiler.  Don't use within 
`eval-when-compile'."
              "cc-bytecomp-defvar: Covered variable %s" ',var))))))
 
 (defmacro cc-bytecomp-defun (fun)
-  "Bind the symbol as a function during compilation of the file,
-to silence the byte compiler.  Don't use within `eval-when-compile'.
+  "Bind the symbol FUN as a function during compilation of the file.
+This can be used to silence the byte compiler.  Don't use within
+`eval-when-compile'.
 
 If the symbol already is bound as a function, it will keep that
 definition.  That means that this macro will not shut up warnings
@@ -431,8 +433,8 @@ at compile time, e.g. for macros and inline functions."
              "cc-bytecomp-defun: Covered function %s" ',fun))))))
 
 (defmacro cc-bytecomp-put (symbol propname value)
-  "Set a property on a symbol during compilation (and evaluation) of
-the file.  Don't use outside `eval-when-compile'."
+  "Set a property on SYMBOL during compilation (and evaluation) of the file.
+Don't use outside `eval-when-compile'."
   (declare (debug t))
   `(eval-when-compile
      (if (not (assoc (cons ,symbol ,propname) cc-bytecomp-original-properties))
@@ -450,9 +452,9 @@ the file.  Don't use outside `eval-when-compile'."
       ,propname ,symbol ,value)))
 
 (defmacro cc-bytecomp-boundp (symbol)
-  "Return non-nil if the given symbol is bound as a variable outside
-the compilation.  This is the same as using `boundp' but additionally
-exclude any variables that have been bound during compilation with
+  "Return non-nil if SYMBOL is bound as a variable outside the compilation.
+This is the same as using `boundp' but additionally exclude any
+variables that have been bound during compilation with
 `cc-bytecomp-defvar'."
   (declare (debug t))
   (if (and (cc-bytecomp-is-compiling)
@@ -461,9 +463,9 @@ exclude any variables that have been bound during 
compilation with
     `(boundp ,symbol)))
 
 (defmacro cc-bytecomp-fboundp (symbol)
-  "Return non-nil if the given symbol is bound as a function outside
-the compilation.  This is the same as using `fboundp' but additionally
-exclude any functions that have been bound during compilation with
+  "Return non-nil if SYMBOL is bound as a function outside the compilation.
+This is the same as using `fboundp' but additionally exclude any
+functions that have been bound during compilation with
 `cc-bytecomp-defun'."
   (declare (debug t))
   (let (fun-elem)
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index 217281b8a2..6c3da667bf 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -5113,8 +5113,9 @@ inside a preprocessor directive."
 
 (defun c-context-open-line ()
   "Insert a line break suitable to the context and leave point before it.
-This is the `c-context-line-break' equivalent to `open-line', which is
-normally bound to C-o.  See `c-context-line-break' for the details."
+This is the `c-context-line-break' equivalent to `open-line'
+\(bound to \\[open-line]).  See `c-context-line-break' for the
+details."
   (interactive "*")
   (let ((here (point)))
     (unwind-protect
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index be0b40fd6c..12e10c26ee 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -827,9 +827,9 @@ right side of it."
 ;; impossible to get a feel for how that function works.
 
 (defmacro c-go-list-forward (&optional pos limit)
-  "Move forward across one balanced group of parentheses starting at POS or
-point.  Return POINT when we succeed, NIL when we fail.  In the latter case,
-leave point unmoved.
+  "Move forward across one balanced group of parentheses starting at POS or 
point.
+Return POINT when we succeed, NIL when we fail.  In the latter
+case, leave point unmoved.
 
 A LIMIT for the search may be given.  The start position is assumed to be
 before it."
@@ -838,9 +838,9 @@ before it."
      (when dest (goto-char dest) dest)))
 
 (defmacro c-go-list-backward (&optional pos limit)
-  "Move backward across one balanced group of parentheses starting at POS or
-point.  Return POINT when we succeed, NIL when we fail.  In the latter case,
-leave point unmoved.
+  "Move backward across one balanced group of parentheses starting at POS or 
point.
+Return POINT when we succeed, NIL when we fail.  In the latter
+case, leave point unmoved.
 
 A LIMIT for the search may be given.  The start position is assumed to be
 after it."
@@ -2593,7 +2593,7 @@ quoted."
 (defvar c-lang-constants-under-evaluation nil
   "Alist of constants in the process of being evaluated.
 The `cdr' of each entry indicates how far we've looked in the list
-of definitions, so that the def for var FOO in c-mode can be defined in
+of definitions, so that the def for var FOO in `c-mode' can be defined in
 terms of the def for that same var FOO (which will then rely on the
 fallback definition for all modes, to break the cycle).")
 
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 53c382f018..20cdb72ccf 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -1545,7 +1545,7 @@ comment at the start of cc-engine.el for more info."
            nil))))))
 
 (defun c-at-statement-start-p ()
-  "Return non-nil if the point is at the first token in a statement
+  "Return non-nil if point is at the first token in a statement
 or somewhere in the syntactic whitespace before it.
 
 A \"statement\" here is not restricted to those inside code blocks.
@@ -1574,7 +1574,7 @@ comment at the start of cc-engine.el for more info."
          (c-crosses-statement-barrier-p (point) end)))))
 
 (defun c-at-expression-start-p ()
-  "Return non-nil if the point is at the first token in an expression or
+  "Return non-nil if point is at the first token in an expression or
 statement, or somewhere in the syntactic whitespace before it.
 
 An \"expression\" here is a bit different from the normal language
@@ -4969,7 +4969,7 @@ out of an enclosing paren."
             nil))))
 
 (defun c-forward-over-token-and-ws (&optional balanced)
-  "Move forward over a token and any following whitespace
+  "Move forward over a token and any following whitespace.
 Return t if we moved, nil otherwise (i.e. we were at EOB, or a
 non-token or BALANCED is non-nil and we can't move).  If we
 are at syntactic whitespace, move over this in place of a token.
@@ -5384,8 +5384,8 @@ comment at the start of cc-engine.el for more info."
 (defvar safe-pos-list)           ; bound in c-syntactic-skip-backward
 
 (defun c-syntactic-skip-backward (skip-chars &optional limit paren-level)
-  "Like `skip-chars-backward' but only look at syntactically relevant chars,
-i.e. don't stop at positions inside syntactic whitespace or string
+  "Like `skip-chars-backward' but only look at syntactically relevant chars.
+This means don't stop at positions inside syntactic whitespace or string
 literals.  Preprocessor directives are also ignored, with the exception
 of the one that the point starts within, if any.  If LIMIT is given,
 it's assumed to be at a syntactically relevant position.
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el
index 7e7053b98e..bc0ae6cc95 100644
--- a/lisp/progmodes/cc-fonts.el
+++ b/lisp/progmodes/cc-fonts.el
@@ -1765,7 +1765,7 @@ casts and declarations are fontified.  Used on level 2 
and higher."
                    (> (match-beginning 0) (point-min))
                    (memq (c-get-char-property (1- (match-beginning 0)) 'face)
                          '(font-lock-comment-face font-lock-string-face
-                           font-lock-comment-delimiter-face))))                
           
+                           font-lock-comment-delimiter-face))))
        (when found
          (setq open-delim (cons (match-beginning 1)
                                 (cons (match-end 1) (match-beginning 2)))
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index b106454b11..36f12369fc 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -4178,8 +4178,7 @@ aliases in Emacs are resolved."
               (cdr c-emacs-variable-inits))))
 
 (defun c-make-init-lang-vars-fun (mode)
-  "Create a function that initializes all the language dependent variables
-for the given mode.
+  "Create a function that initializes all language dependent variables for 
MODE.
 
 This function should be evaluated at compile time, so that the
 function it returns is byte compiled with all the evaluated results
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index c818c1a358..8b30241449 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -1648,7 +1648,7 @@ Note that the style variables are always made local to 
the buffer."
             (and (memq (char-before) c-string-delims)
                  (not (nth 4 s)))))    ; Check we're actually out of the
                                        ; comment. not stuck at EOB
-       (unless 
+       (unless
            (and c-ml-string-opener-re
                 (c-maybe-re-mark-ml-string))
          (if (c-unescaped-nls-in-string-p (1- (point)))
diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el
index dcd9546d9a..8869c56573 100644
--- a/lisp/progmodes/cc-vars.el
+++ b/lisp/progmodes/cc-vars.el
@@ -1227,7 +1227,7 @@ can always override the use of `c-default-style' by 
making calls to
        ;; Anchor pos: None.
        ))
 (defcustom c-offsets-alist nil
-  "Association list of syntactic element symbols and indentation offsets.
+  "Alist of syntactic element symbols and indentation offsets.
 As described below, each cons cell in this list has the form:
 
     (SYNTACTIC-SYMBOL . OFFSET)
diff --git a/lisp/progmodes/cmacexp.el b/lisp/progmodes/cmacexp.el
index 0f7c8c6f31..07648ac623 100644
--- a/lisp/progmodes/cmacexp.el
+++ b/lisp/progmodes/cmacexp.el
@@ -101,7 +101,7 @@
   :type 'boolean)
 
 (defcustom c-macro-prompt-flag nil
-  "Non-nil makes `c-macro-expand' prompt for preprocessor arguments."
+  "Non-nil means `c-macro-expand' will prompt for preprocessor arguments."
   :type 'boolean)
 
 (defcustom c-macro-preprocessor
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 431b01b8ba..73f9806811 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -687,11 +687,13 @@ matched file names, and weeding out false positives."
                    ,(expand-file-name "compilation.txt" data-directory)))
 
 (defvar compilation-error-case-fold-search nil
-  "If non-nil, use case-insensitive matching of compilation errors
-by the regexps of `compilation-error-regexp-alist' and
-`compilation-error-regexp-alist-alist'.
+  "If non-nil, use case-insensitive matching of compilation errors.
 If nil, matching is case-sensitive.
 
+Compilation errors are given by the regexps in
+`compilation-error-regexp-alist' and
+`compilation-error-regexp-alist-alist'.
+
 This variable should only be set for backward compatibility as a temporary
 measure.  The proper solution is to use a regexp that matches the
 messages without case-folding.")
@@ -2260,7 +2262,7 @@ by replacing the first word, e.g., 
`compilation-scroll-output' from
   (if buffer-file-name
       (let (revert-buffer-function)
        (revert-buffer ignore-auto noconfirm))
-    (if (or noconfirm (yes-or-no-p (format "Restart compilation? ")))
+    (if (or noconfirm (yes-or-no-p "Restart compilation? "))
        (apply #'compilation-start compilation-arguments))))
 
 (defvar compilation-current-error nil
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 634dd29bad..c371a84b9d 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -361,14 +361,14 @@ Affects: `cperl-font-lock', `cperl-electric-lbrace-space',
 ;;   :group 'cperl)
 
 (defcustom cperl-info-on-command-no-prompt nil
-  "Not-nil (and non-null) means not to prompt on C-h f.
+  "Not-nil (and non-null) means not to prompt on \\[cperl-info-on-command].
 The opposite behavior is always available if prefixed with C-c.
 Can be overwritten by `cperl-hairy' if nil."
   :type '(choice (const null) boolean)
   :group 'cperl-affected-by-hairy)
 
 (defcustom cperl-clobber-lisp-bindings nil
-  "Not-nil (and non-null) means not overwrite C-h f.
+  "Not-nil (and non-null) means not overwrite \\[describe-function].
 The function is available on \\[cperl-info-on-command], \\[cperl-get-help].
 Can be overwritten by `cperl-hairy' if nil."
   :type '(choice (const null) boolean)
diff --git a/lisp/progmodes/cpp.el b/lisp/progmodes/cpp.el
index 6602a79b2a..d800365e66 100644
--- a/lisp/progmodes/cpp.el
+++ b/lisp/progmodes/cpp.el
@@ -711,8 +711,8 @@ BRANCH should be either nil (false branch), t (true branch) 
or `both'."
       default))
 
 (defun cpp-choose-default-face (type)
-  ;; Choose default face list for screen of TYPE.
-  ;; Type must be one of the types defined in `cpp-face-type-list'.
+  "Choose default face list for screen of TYPE.
+Type must be one of the types defined in `cpp-face-type-list'."
   (interactive (list (if cpp-button-event
                         (x-popup-menu cpp-button-event
                                       (list "Screen type"
@@ -789,7 +789,7 @@ BRANCH should be either nil (false branch), t (true branch) 
or `both'."
                                 (if data (list 'cpp-data data))))))
 
 (defun cpp-push-button (event)
-  ;; Pushed a CPP button.
+  "Pushed a CPP button."
   (interactive "@e")
   (set-buffer (window-buffer (posn-window (event-start event))))
   (let ((pos (posn-point (event-start event))))
diff --git a/lisp/progmodes/dcl-mode.el b/lisp/progmodes/dcl-mode.el
index ed024f2434..b74b558f8d 100644
--- a/lisp/progmodes/dcl-mode.el
+++ b/lisp/progmodes/dcl-mode.el
@@ -494,7 +494,7 @@ Variables controlling indentation style and extra features:
     These variables control the look of expanded templates.
 
  dcl-imenu-generic-expression
-    Default value for imenu-generic-expression.  The default includes
+    Default value for `imenu-generic-expression'.  The default includes
     SUBROUTINE labels in the main listing and sub-listings for
     other labels, CALL, GOTO and GOSUB statements.
 
@@ -1463,7 +1463,7 @@ Inserts continuation marks and splits character strings."
 
 ;;;-------------------------------------------------------------------------
 (defun dcl-delete-indentation (&optional arg)
-  "Join this line to previous like delete-indentation.
+  "Join this line to previous like `delete-indentation'.
 Also remove the continuation mark if easily detected."
   (interactive "*P")
   (delete-indentation arg)
diff --git a/lisp/progmodes/ebnf-yac.el b/lisp/progmodes/ebnf-yac.el
index 816cc432d1..84950e45f5 100644
--- a/lisp/progmodes/ebnf-yac.el
+++ b/lisp/progmodes/ebnf-yac.el
@@ -113,7 +113,7 @@
 ;;; YACC-Code = "any C definition".
 
 (defun ebnf-yac-parser (start)
-  "yacc/Bison parser."
+  "Yacc/Bison parser."
   (let ((total (+ (- ebnf-limit start) 1))
        (bias (1- start))
        (origin (point))
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 04311985c1..0b2395d976 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -158,26 +158,33 @@ All commands in `lisp-mode-shared-map' are inherited by 
this map.")
   (when (thing-at-mouse click 'symbol)
     (define-key-after menu [elisp-separator] menu-bar-separator
       'middle-separator)
-    (define-key-after menu [info-lookup-symbol]
-      '(menu-item "Look up in Manual"
-                  (lambda (click) (interactive "e")
-                    (info-lookup-symbol
-                     (intern (thing-at-mouse click 'symbol t))))
-                  :help "Display definition in relevant manual")
-      'elisp-separator)
+
     (let* ((string (thing-at-mouse click 'symbol t))
            (symbol (when (stringp string) (intern string)))
            (title (cond
                    ((not (symbolp symbol)) nil)
-                   ((fboundp symbol) "Function")
-                   ((and (boundp symbol) (not (keywordp symbol))) "Variable")
-                   ((facep symbol) "Face"))))
+                   ((and (facep symbol) (not (fboundp symbol)))
+                    "Face")
+                   ((and (fboundp symbol)
+                         (not (or (boundp symbol) (facep symbol))))
+                    "Function")
+                   ((and (boundp symbol)
+                         (not (or (fboundp symbol) (facep symbol))))
+                    "Variable")
+                   ((or (fboundp symbol) (boundp symbol) (facep symbol))
+                    "Symbol"))))
       (when title
+        (define-key-after menu [info-lookup-symbol]
+          `(menu-item "Look up in Manual"
+                      (lambda (_click) (interactive "e")
+                        (info-lookup-symbol ',symbol))
+                      :help ,(format "Find `%s' in relevant manual" symbol))
+          'elisp-separator)
         (define-key-after menu [describe-symbol]
           `(menu-item (format "Describe %s" ,title)
                       (lambda (_click) (interactive "e")
                         (describe-symbol ',symbol))
-                      :help "Display the full documentation of symbol")
+                      :help ,(format "Display the documentation of `%s'" 
symbol))
           'elisp-separator))))
   menu)
 
@@ -980,7 +987,7 @@ namespace but with lower confidence."
               ;; First call to find-lisp-object-file-name for an object
               ;; defined in C; the doc strings from the C source have
               ;; not been loaded yet.  Second call will return "src/*.c"
-              ;; in file; handled by 't' case below.
+              ;; in file; handled by t case below.
               (push (elisp--xref-make-xref nil symbol (help-C-file-name 
(symbol-function symbol) 'subr)) xrefs))
 
              ((and (setq doc (documentation symbol t))
@@ -1024,7 +1031,7 @@ namespace but with lower confidence."
                                   specializers))
                        (file (find-lisp-object-file-name met-name 
'cl-defmethod)))
                   (dolist (item specializers)
-                    ;; default method has all 't' in specializers
+                    ;; Default method has all t in specializers.
                     (setq non-default (or non-default (not (equal t item)))))
 
                   (when (and file
diff --git a/lisp/progmodes/f90.el b/lisp/progmodes/f90.el
index 3f2c9b7148..f9e6101e7a 100644
--- a/lisp/progmodes/f90.el
+++ b/lisp/progmodes/f90.el
@@ -65,8 +65,8 @@
 ;; the variable f90-comment-region in every line of the region.
 
 ;; One common convention for free vs. fixed format is that free format
-;; files have the ending .f90 or .f95 while fixed format files have
-;; the ending .f. Emacs automatically loads Fortran files in the
+;; files have the ending ".f90" or ".f95" while fixed format files have
+;; the ending ".f".  Emacs automatically loads Fortran files in the
 ;; appropriate mode based on extension.  You can modify this by
 ;; adjusting the variable `auto-mode-alist'.
 ;; For example:
@@ -984,7 +984,7 @@ Used in the F90 entry in `hs-special-modes-alist'.")
 ;; FIXME trivial to extend this to enum. Worth it?
 (defun f90-imenu-type-matcher ()
   "Search backward for the start of a derived type.
-Set subexpression 1 in the match-data to the name of the type."
+Set subexpression 1 in the `match-data' to the name of the type."
   (let (found)
     (while (and (re-search-backward "^[ \t0-9]*type[ \t]*" nil t)
                 (not (setq found
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index e8ce0e723e..9418debe5e 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -559,7 +559,7 @@ Currently accepted REPORT-KEY arguments are:
 (put :warning 'flymake-category 'flymake-warning)
 (put :note 'flymake-category 'flymake-note)
 
-(defvar flymake-diagnostic-types-alist '() "")
+(defvar flymake-diagnostic-types-alist '())
 (make-obsolete-variable
  'flymake-diagnostic-types-alist
  "Set properties on the diagnostic symbols instead.  See Info
@@ -1329,7 +1329,7 @@ default) no filter is applied."
 
 ;;; Mode-line and menu
 ;;;
-(easy-menu-define flymake-menu flymake-mode-map "Flymake"
+(easy-menu-define flymake-menu flymake-mode-map "Flymake menu."
   '("Flymake"
     [ "Go to next problem"      flymake-goto-next-error t ]
     [ "Go to previous problem"  flymake-goto-prev-error t ]
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 902466e4fe..3e5b8e2f32 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -467,8 +467,8 @@ GDB session needs to be restarted for this setting to take 
effect."
 ;; TODO Some commands can't be called with --all (give a notice about
 ;; it in setting doc)
 (defcustom gdb-gud-control-all-threads t
-  "When non-nil, GUD execution commands affect all threads when
-in non-stop mode.  Otherwise, only current thread is affected."
+  "When non-nil, GUD execution commands affect all threads when in non-stop 
mode.
+Otherwise, only current thread is affected."
   :type 'boolean
   :group 'gdb-non-stop
   :version "23.2")
@@ -1483,7 +1483,7 @@ INDENT is the current indentation depth."
                (expr (nth 1 var)) (children (nth 2 var)))
           (if (or (<= (string-to-number children) gdb-max-children)
                   (y-or-n-p
-                   (format "%s has %s children. Continue? " expr children)))
+                    (format "%s has %s children.  Continue?" expr children)))
               (gdb-var-list-children token))))
        ((string-search "-" text)       ;contract this node
         (dolist (var gdb-var-list)
diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el
index d7f4582dd0..ec2850737c 100644
--- a/lisp/progmodes/grep.el
+++ b/lisp/progmodes/grep.el
@@ -72,7 +72,7 @@ SYMBOL should be one of `grep-command', `grep-template',
 Some grep programs are able to surround matches with special
 markers in grep output.  Such markers can be used to highlight
 matches in grep mode.  This requires `font-lock-mode' to be active
-in grep buffers, so if you have globally disabled font-lock-mode,
+in grep buffers, so if you have globally disabled `font-lock-mode',
 you will not get highlighting.
 
 This option sets the environment variable GREP_COLORS to specify
@@ -137,7 +137,7 @@ The following place holders should be present in the string:
  <F> - file names and wildcards to search.
  <X> - file names and wildcards to exclude.
  <R> - the regular expression searched for.
- <N> - place to insert null-device.
+ <N> - place to insert `null-device'.
 
 In interactive usage, the actual value of this variable is set up
 by `grep-compute-defaults'; to change the default value, use
diff --git a/lisp/progmodes/hideshow.el b/lisp/progmodes/hideshow.el
index b2557587c6..e2ad480281 100644
--- a/lisp/progmodes/hideshow.el
+++ b/lisp/progmodes/hideshow.el
@@ -62,7 +62,7 @@
 ;; activated or deactivated, `hs-minor-mode-hook' is run w/ `run-hooks'.
 ;;
 ;; Additionally, Joseph Eydelnant writes:
-;;   I enjoy your package hideshow.el Ver. 5.24 2001/02/13
+;;   I enjoy your package hideshow.el Version 5.24 2001/02/13
 ;;   a lot and I've been looking for the following functionality:
 ;;   toggle hide/show all with a single key.
 ;;   Here are a few lines of code that lets me do just that.
diff --git a/lisp/progmodes/idlw-help.el b/lisp/progmodes/idlw-help.el
index ffa3d78b4d..df04a43d3f 100644
--- a/lisp/progmodes/idlw-help.el
+++ b/lisp/progmodes/idlw-help.el
@@ -66,9 +66,6 @@ is used in preference to the old 
`idlwave-html-help-location'."
 6.2 or later (see `idlwave-html-system-help-location')."
   :type 'directory)
 
-(defvar idlwave-help-use-hh nil
-  "Obsolete variable.")
-
 (defcustom idlwave-help-use-assistant t
   "Whether to use the IDL Assistant as the help browser."
   :type 'boolean)
@@ -98,9 +95,6 @@ must be explicitly set non-nil in order for the variable
 `idlwave-help-use-dedicated-frame' to function."
   :type 'boolean)
 
-(defvar idlwave-help-directory ""
-  "Obsolete variable.  See `idlwave-html-help-location'.")
-
 (defcustom idlwave-help-use-dedicated-frame t
   "Non-nil means, use a separate frame for Online Help if possible."
   :type 'boolean)
@@ -1348,8 +1342,15 @@ IDL assistant.")
     (setq idlwave-help-assistant-socket nil
          idlwave-help-assistant-process nil)))
 
+;;; Obsolete
+
 (defvar idlwave-help-browse-url-available t)
 (make-obsolete-variable 'idlwave-help-browse-url-available nil "28.1")
+(defvar idlwave-help-use-hh nil "Obsolete variable.")
+(make-obsolete-variable 'idlwave-help-use-hh nil "28.1")
+(defvar idlwave-help-directory ""
+  "Obsolete variable.  See `idlwave-html-help-location'.")
+(make-obsolete-variable 'idlwave-help-directory nil "28.1")
 
 (provide 'idlw-help)
 (provide 'idlwave-help)
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index e95abd863e..d6828eeffb 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -5316,7 +5316,7 @@ directories and save the routine info.
 
 (defun idlwave-delete-user-catalog-file (&rest _ignore)
   (if (yes-or-no-p
-       (format "Delete file %s " idlwave-user-catalog-file))
+       (format "Delete file %s?" idlwave-user-catalog-file))
       (progn
        (delete-file idlwave-user-catalog-file)
        (message "%s has been deleted" idlwave-user-catalog-file))))
@@ -7786,7 +7786,7 @@ force class query for object methods."
                (if (or (not this-buffer)
                        (assoc default list))
                    (format-prompt "Module" default)
-                 (format "Module in this file: "))
+                 "Module in this file: ")
                list))
         type class)
     (if (string-match "\\`\\s-*\\'" name)
diff --git a/lisp/progmodes/opascal.el b/lisp/progmodes/opascal.el
index 51c888d25f..e55b09d8fc 100644
--- a/lisp/progmodes/opascal.el
+++ b/lisp/progmodes/opascal.el
@@ -51,7 +51,7 @@
   :group 'languages)
 
 (defconst opascal-debug nil
-  "True if in debug mode.")
+  "Non-nil if in debug mode.")
 
 (define-obsolete-variable-alias
   'delphi-search-path 'opascal-search-path "24.4")
@@ -1732,7 +1732,8 @@ comment block.  If not in a // comment, just does a 
normal newline."
 (define-obsolete-function-alias 'delphi-mode #'opascal-mode "24.4")
 ;;;###autoload
 (define-derived-mode opascal-mode prog-mode "OPascal"
-  "Major mode for editing OPascal code.\\<opascal-mode-map>
+  "Major mode for editing OPascal code.
+\\<opascal-mode-map>
 \\[opascal-find-unit]\t- Search for a OPascal source file.
 \\[opascal-fill-comment]\t- Fill the current comment.
 \\[opascal-new-comment-line]\t- If in a // comment, do a new comment line.
diff --git a/lisp/progmodes/prog-mode.el b/lisp/progmodes/prog-mode.el
index 88d55a647c..6c09dcf881 100644
--- a/lisp/progmodes/prog-mode.el
+++ b/lisp/progmodes/prog-mode.el
@@ -48,27 +48,26 @@
   (require 'xref)
   (define-key-after menu [prog-separator] menu-bar-separator
     'middle-separator)
-  (when (not (xref-marker-stack-empty-p))
+
+  (unless (xref-marker-stack-empty-p)
     (define-key-after menu [xref-pop]
       '(menu-item "Back Definition" xref-pop-marker-stack
                   :help "Back to the position of the last search")
       'prog-separator))
-  (when (save-excursion
-          (mouse-set-point click)
-          (xref-backend-identifier-at-point
-           (xref-find-backend)))
-    (define-key-after menu [xref-find-ref]
-      '(menu-item "Find References" xref-find-references-at-mouse
-                  :help "Find references to identifier")
-      'prog-separator))
-  (when (save-excursion
-          (mouse-set-point click)
-          (xref-backend-identifier-at-point
-           (xref-find-backend)))
-    (define-key-after menu [xref-find-def]
-      '(menu-item "Find Definition" xref-find-definitions-at-mouse
-                  :help "Find definition of identifier")
-      'prog-separator))
+
+  (let ((identifier (save-excursion
+                      (mouse-set-point click)
+                      (xref-backend-identifier-at-point
+                       (xref-find-backend)))))
+    (when identifier
+      (define-key-after menu [xref-find-ref]
+        `(menu-item "Find References" xref-find-references-at-mouse
+                    :help ,(format "Find references to `%s'" identifier))
+        'prog-separator)
+      (define-key-after menu [xref-find-def]
+        `(menu-item "Find Definition" xref-find-definitions-at-mouse
+                    :help ,(format "Find definition of `%s'" identifier))
+        'prog-separator)))
   menu)
 
 (defvar prog-mode-map
@@ -128,7 +127,7 @@ which case it will be used to compose the new symbol as per 
the
 third argument of `compose-region'.")
 
 (defun prettify-symbols-default-compose-p (start end _match)
-  "Return true iff the symbol MATCH should be composed.
+  "Return non-nil iff the symbol MATCH should be composed.
 The symbol starts at position START and ends at position END.
 This is the default for `prettify-symbols-compose-predicate'
 which is suitable for most programming languages such as C or Lisp."
@@ -146,7 +145,7 @@ which is suitable for most programming languages such as C 
or Lisp."
   "A predicate for deciding if the currently matched symbol is to be composed.
 The matched symbol is the car of one entry in `prettify-symbols-alist'.
 The predicate receives the match's start and end positions as well
-as the match-string as arguments.")
+as the `match-string' as arguments.")
 
 (defun prettify-symbols--compose-symbol (alist)
   "Compose a sequence of characters into a symbol.
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 563b9c3c90..68beedad3d 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -703,7 +703,8 @@ DIRS must contain directory names."
     (define-key map "F" 'project-or-external-find-file)
     (define-key map "b" 'project-switch-to-buffer)
     (define-key map "s" 'project-shell)
-    (define-key map "d" 'project-dired)
+    (define-key map "d" 'project-find-dir)
+    (define-key map "D" 'project-dired)
     (define-key map "v" 'project-vc-dir)
     (define-key map "c" 'project-compile)
     (define-key map "e" 'project-eshell)
@@ -915,7 +916,13 @@ by the user at will."
          (prompt (if (zerop cpd-length)
                      prompt
                    (concat prompt (format " in %s" common-parent-directory))))
+         (included-cpd (when (member common-parent-directory all-files)
+                         (setq all-files
+                               (delete common-parent-directory all-files))
+                         t))
          (substrings (mapcar (lambda (s) (substring s cpd-length)) all-files))
+         (_ (when included-cpd
+              (setq substrings (cons "./" substrings))))
          (new-collection (project--file-completion-table substrings))
          (res (project--completing-read-strict prompt
                                                new-collection
@@ -959,6 +966,26 @@ is used as part of \"future history\"."
                      nil
                      hist)))
 
+;;;###autoload
+(defun project-find-dir ()
+  "Start Dired in a directory inside the current project."
+  (interactive)
+  (let* ((project (project-current t))
+         (all-files (project-files project))
+         (completion-ignore-case read-file-name-completion-ignore-case)
+         ;; FIXME: This misses directories without any files directly
+         ;; inside.  Consider DIRS-ONLY as an argument for
+         ;; `project-files-filtered', and see
+         ;; https://stackoverflow.com/a/50685235/615245 for possible
+         ;; implementation.
+         (all-dirs (mapcar #'file-name-directory all-files))
+         (dir (funcall project-read-file-name-function
+                       "Dired"
+                       ;; Some completion UIs show duplicates.
+                       (delete-dups all-dirs)
+                       nil nil)))
+    (dired dir)))
+
 ;;;###autoload
 (defun project-dired ()
   "Start Dired in the current project's root."
@@ -1035,8 +1062,8 @@ command \\[fileloop-continue]."
 (defun project-query-replace-regexp (from to)
   "Query-replace REGEXP in all the files of the project.
 Stops when a match is found and prompts for whether to replace it.
-If you exit the query-replace, you can later continue the query-replace
-loop using the command \\[fileloop-continue]."
+If you exit the `query-replace', you can later continue the
+`query-replace' loop using the command \\[fileloop-continue]."
   (interactive
    (pcase-let ((`(,from ,to)
                 (query-replace-read-args "Query replace (regexp)" t t)))
@@ -1298,9 +1325,10 @@ With some possible metadata (to be decided).")
       (write-region nil nil filename nil 'silent))))
 
 ;;;###autoload
-(defun project-remember-project (pr)
+(defun project-remember-project (pr &optional no-write)
   "Add project PR to the front of the project list.
-Save the result in `project-list-file' if the list of projects has changed."
+Save the result in `project-list-file' if the list of projects
+has changed, and NO-WRITE is nil."
   (project--ensure-read-project-list)
   (let ((dir (project-root pr)))
     (unless (equal (caar project--list) dir)
@@ -1308,7 +1336,8 @@ Save the result in `project-list-file' if the list of 
projects has changed."
         (when (equal dir (car ent))
           (setq project--list (delq ent project--list))))
       (push (list dir) project--list)
-      (project--write-project-list))))
+      (unless no-write
+        (project--write-project-list)))))
 
 (defun project--remove-from-project-list (project-root report-message)
   "Remove directory PROJECT-ROOT of a missing project from the project list.
@@ -1323,7 +1352,7 @@ passed to `message' as its first argument."
     (project--write-project-list)))
 
 ;;;###autoload
-(defun project-remove-known-project (project-root)
+(defun project-forget-project (project-root)
   "Remove directory PROJECT-ROOT from the project list.
 PROJECT-ROOT is the root directory of a known project listed in
 the project list."
@@ -1365,13 +1394,77 @@ It's also possible to enter an arbitrary directory not 
in the list."
   (let ((default-directory (project-root (project-current t))))
     (call-interactively #'execute-extended-command)))
 
+(defun project-remember-projects-under (dir &optional recursive)
+  "Index all projects below a directory DIR.
+If RECURSIVE is non-nil, recurse into all subdirectories to find
+more projects.  After finishing, a message is printed summarizing
+the progress.  The function returns the number of detected
+projects."
+  (interactive "DDirectory: \nP")
+  (project--ensure-read-project-list)
+  (let ((queue (directory-files dir t nil t)) (count 0)
+        (known (make-hash-table
+                :size (* 2 (length project--list))
+                :test #'equal )))
+    (dolist (project (mapcar #'car project--list))
+      (puthash project t known))
+    (while queue
+      (when-let ((subdir (pop queue))
+                 ((file-directory-p subdir))
+                 ((not (gethash subdir known))))
+        (when-let (pr (project--find-in-directory subdir))
+          (project-remember-project pr t)
+          (message "Found %s..." (project-root pr))
+          (setq count (1+ count)))
+        (when (and recursive (file-symlink-p subdir))
+          (setq queue (nconc (directory-files subdir t nil t) queue))
+          (puthash subdir t known))))
+    (unless (eq recursive 'in-progress)
+      (if (zerop count)
+          (message "No projects were found")
+        (project--write-project-list)
+        (message "%d project%s were found"
+                 count (if (= count 1) "" "s"))))
+    count))
+
+(defun project-forget-zombie-projects ()
+  "Forget all known projects that don't exist any more."
+  (interactive)
+  (dolist (proj (project-known-project-roots))
+    (unless (file-exists-p proj)
+      (project-forget-project proj))))
+
+(defun project-forget-projects-under (dir &optional recursive)
+  "Forget all known projects below a directory DIR.
+If RECURSIVE is non-nil, recurse into all subdirectories to
+remove all known projects.  After finishing, a message is printed
+summarizing the progress.  The function returns the number of
+forgotten projects."
+  (interactive "DDirectory: \nP")
+  (let ((count 0))
+    (if recursive
+        (dolist (proj (project-known-project-roots))
+          (when (file-in-directory-p proj dir)
+            (project-forget-project proj)
+            (setq count (1+ count))))
+      (dolist (proj (project-known-project-roots))
+        (when (file-equal-p (file-name-directory proj) dir)
+          (project-forget-project proj)
+          (setq count (1+ count)))))
+    (if (zerop count)
+        (message "No projects were forgotten")
+      (project--write-project-list)
+      (message "%d project%s were forgotten"
+               count (if (= count 1) "" "s")))
+    count))
+
 
 ;;; Project switching
 
 (defcustom project-switch-commands
   '((project-find-file "Find file")
     (project-find-regexp "Find regexp")
-    (project-dired "Dired")
+    (project-find-dir "Find directory")
     (project-vc-dir "VC-Dir")
     (project-eshell "Eshell"))
   "Alist mapping commands to descriptions.
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index f848f4c103..c58ac6f637 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -775,12 +775,21 @@ is used to limit the scan."
            ;; The first quote is escaped, so it's not part of a triple quote!
            (goto-char (1+ quote-starting-pos)))
           ((null string-start)
-           ;; This set of quotes delimit the start of a string.
-           (put-text-property quote-starting-pos (1+ quote-starting-pos)
+           ;; This set of quotes delimit the start of a string.  Put
+           ;; string fence syntax on last quote. (bug#49518)
+           ;; FIXME: This makes sexp-movement a bit suboptimal since """a"""
+           ;; is now treated as 3 strings.
+           ;; We could probably have our cake and eat it too by
+           ;; putting the string fence on the first quote and then
+           ;; convincing `syntax-ppss-flush-cache' to flush to before
+           ;; that fence when any char of the 3-char delimiter
+           ;; is modified.
+           (put-text-property (1- quote-ending-pos) quote-ending-pos
                               'syntax-table (string-to-syntax "|")))
           (t
-           ;; This set of quotes delimit the end of a string.
-           (put-text-property (1- quote-ending-pos) quote-ending-pos
+           ;; This set of quotes delimit the end of a string.  Put
+           ;; string fence syntax on first quote. (bug#49518)
+           (put-text-property quote-starting-pos (1+ quote-starting-pos)
                               'syntax-table (string-to-syntax "|"))))))
 
 (defvar python-mode-syntax-table
@@ -4308,6 +4317,7 @@ JUSTIFY should be used (if applicable) as in 
`fill-paragraph'."
                (and (equal (string-to-syntax "|")
                            (syntax-after (point)))
                     (point)))))
+         ;; JT@2021-09-21: Since bug#49518's fix this will always be 1
          (num-quotes (python-syntax-count-quotes
                       (char-after str-start-pos) str-start-pos))
          (str-line-start-pos
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index ef2c21da45..ac6a8fbbcb 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -1,4 +1,4 @@
-;;; verilog-mode.el --- major mode for editing verilog source in Emacs
+;;; verilog-mode.el --- major mode for editing verilog source in Emacs  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 1996-2021 Free Software Foundation, Inc.
 
@@ -9,7 +9,7 @@
 ;; Keywords: languages
 ;; The "Version" is the date followed by the decimal rendition of the Git
 ;;     commit hex.
-;; Version: 2021.09.16.045775504
+;; Version: 2021.09.23.089128420
 
 ;; Yoni Rabkin <yoni@rabkins.net> contacted the maintainer of this
 ;; file on 19/3/2008, and the maintainer agreed that when a bug is
@@ -124,7 +124,7 @@
 ;;
 
 ;; This variable will always hold the version number of the mode
-(defconst verilog-mode-version "2021-09-16-2ba7a90-vpo-GNU"
+(defconst verilog-mode-version "2021-09-23-54ffde4-vpo-GNU"
   "Version of this Verilog mode.")
 (defconst verilog-mode-release-emacs t
   "If non-nil, this version of Verilog mode was released with Emacs itself.")
@@ -414,7 +414,7 @@ wherever possible, since it is slow."
 ;;     "----" ["MB" nil :help "Help MB"]))
 
 (defun verilog-define-abbrev-table (tablename definitions &optional docstring 
&rest props)
-  "Filter `define-abbrev-table' TABLENAME DEFINITIONS
+  "Filter `define-abbrev-table' TABLENAME DEFINITIONS.
 Provides DOCSTRING PROPS in newer Emacs (23.1)."
   (condition-case nil
       (apply #'define-abbrev-table tablename definitions docstring props)
@@ -591,19 +591,19 @@ If `all' is selected, then all line ups described below 
are done.
 If `declarations', then just declarations are lined up with any
 preceding declarations, taking into account widths and the like,
 so or example the code:
-       reg [31:0] a;
-       reg b;
+        reg [31:0] a;
+        reg b;
 would become
-       reg [31:0] a;
-       reg        b;
+        reg [31:0] a;
+        reg        b;
 
 If `assignment', then assignments are lined up with any preceding
 assignments, so for example the code
-       a_long_variable <= b + c;
-       d = e + f;
+        a_long_variable <= b + c;
+        d = e + f;
 would become
-       a_long_variable <= b + c;
-       d                = e + f;
+        a_long_variable <= b + c;
+        d                = e + f;
 
 In order to speed up editing, large blocks of statements are lined up
 only when a \\[verilog-pretty-expr] is typed; and large blocks of declarations
@@ -641,13 +641,13 @@ Set to 0 to get them list right under containing block."
 (defcustom verilog-indent-declaration-macros nil
   "How to treat macro expansions in a declaration.
 If nil, indent as:
-       input [31:0] a;
-       input        \\=`CP;
-       output       c;
+        input [31:0] a;
+        input        \\=`CP;
+        output       c;
 If non-nil, treat as:
-       input [31:0] a;
-       input \\=`CP    ;
-       output       c;"
+        input [31:0] a;
+        input \\=`CP    ;
+        output       c;"
   :group 'verilog-mode-indent
   :type 'boolean)
 (put 'verilog-indent-declaration-macros 'safe-local-variable 
#'verilog-booleanp)
@@ -655,12 +655,12 @@ If non-nil, treat as:
 (defcustom verilog-indent-lists t
   "How to treat indenting items in a list.
 If t (the default), indent as:
-       always @( posedge a or
-                 reset ) begin
+        always @( posedge a or
+                  reset ) begin
 
 If nil, treat as:
-       always @( posedge a or
-          reset ) begin"
+        always @( posedge a or
+           reset ) begin"
   :group 'verilog-mode-indent
   :type 'boolean)
 (put 'verilog-indent-lists 'safe-local-variable #'verilog-booleanp)
@@ -3563,7 +3563,7 @@ either is ok to parse as a non-comment, or 
`verilog-insert' was used."
 (defun verilog-scan-debug ()
   "For debugging, show with display face results of `verilog-scan'."
   (font-lock-mode 0)
-  ;;(if dbg (setq dbg (concat dbg (format "verilog-scan-debug\n"))))
+  ;;(if dbg (setq dbg (concat dbg "verilog-scan-debug\n")))
   (save-excursion
     (goto-char (point-min))
     (remove-text-properties (point-min) (point-max) '(face nil))
@@ -4759,7 +4759,7 @@ More specifically, after a generate and before an 
endgenerate."
        (while (and
                (/= nest 0)
                (verilog-re-search-backward
-                
"\\<\\(module\\)\\|\\(connectmodule\\)\\|\\(generate\\)\\|\\(endgenerate\\)\\>" 
nil 'move)
+                
"\\<\\(module\\)\\|\\(connectmodule\\)\\|\\(generate\\)\\|\\(endgenerate\\)\\|\\(if\\)\\|\\(case\\)\\|\\(for\\)\\>"
 nil 'move)
                (cond
                 ((match-end 1) ; module - we have crawled out
                  (throw 'done 1))
@@ -4768,7 +4768,13 @@ More specifically, after a generate and before an 
endgenerate."
                 ((match-end 3) ; generate
                  (setq nest (1- nest)))
                 ((match-end 4) ; endgenerate
-                 (setq nest (1+ nest))))))))
+                 (setq nest (1+ nest)))
+                ((match-end 5) ; if
+                 (setq nest (1- nest)))
+                ((match-end 6) ; case
+                 (setq nest (1- nest)))
+                ((match-end 7) ; for
+                 (setq nest (1- nest))))))))
     (= nest 0) )) ; return nest
 
 (defun verilog-in-fork-region-p ()
@@ -5419,7 +5425,7 @@ Useful for creating tri's and other expanded fields."
 (defun verilog-lint-off ()
   "Convert a Verilog linter warning line into a disable statement.
 For example:
-       pci_bfm_null.v, line  46: Unused input: pci_rst_
+        pci_bfm_null.v, line  46: Unused input: pci_rst_
 becomes a comment for the appropriate tool.
 
 The first word of the `compile-command' or `verilog-linter'
@@ -5443,9 +5449,9 @@ Run from Verilog source window; assumes there is a 
*compile* buffer
 with point set appropriately.
 
 For example:
-       WARNING [STD-UDDONX]: xx.v, line 8: output out is never assigned.
+        WARNING [STD-UDDONX]: xx.v, line 8: output out is never assigned.
 becomes:
-       // surefire lint_line_off UDDONX"
+        // surefire lint_line_off UDDONX"
   (interactive)
   (let ((buff (if (boundp 'next-error-last-buffer)
                   next-error-last-buffer
@@ -5504,9 +5510,9 @@ becomes:
   "Convert a Verilint warning line into a disable statement.
 
 For example:
-       (W240)  pci_bfm_null.v, line  46: Unused input: pci_rst_
+        (W240)  pci_bfm_null.v, line  46: Unused input: pci_rst_
 becomes:
-       //Verilint 240 off // WARNING: Unused input"
+        //Verilint 240 off // WARNING: Unused input"
   (interactive)
   (save-excursion
     (beginning-of-line)
@@ -6588,7 +6594,7 @@ Return >0 for nested struct."
                        (equal (char-before) ?\;)
                        (equal (char-before) ?\}))
                    ;; skip what looks like bus repetition operator {#{
-                   (not (string-match "^{\\s-*[0-9a-zA-Z_]+\\s-*{" 
(buffer-substring p (point)))))))))
+                   (not (string-match "^{\\s-*[\\(\\)0-9a-zA-Z_]*\\s-*{" 
(buffer-substring p (point)))))))))
       (progn
         (let ( (pt (point)) (pass 0))
           (verilog-backward-ws&directives)
@@ -9806,11 +9812,11 @@ variable over and over when many modules are compiled 
together, put a test
 around the inside each include file:
 
 foo.v (an include file):
-       \\=`ifdef _FOO_V        // include if not already included
-       \\=`else
-       \\=`define _FOO_V
-       ... contents of file
-       \\=`endif // _FOO_V"
+        \\=`ifdef _FOO_V        // include if not already included
+        \\=`else
+        \\=`define _FOO_V
+        ... contents of file
+        \\=`endif // _FOO_V"
   ;;slow:  (verilog-read-defines nil t)
   (save-excursion
     (verilog-getopt-flags)
@@ -11575,6 +11581,7 @@ See the example in `verilog-auto-inout-modport'."
 (defun verilog-auto-inst-port-map (_port-st)
   nil)
 
+;; These are used by user's AUTO_TEMPLATE Lisp expressions
 (defvar vl-cell-type nil "See `verilog-auto-inst'.") ; Prevent compile warning
 (defvar vl-cell-name nil "See `verilog-auto-inst'.") ; Prevent compile warning
 (defvar vl-memory    nil "See `verilog-auto-inst'.") ; Prevent compile warning
@@ -12589,7 +12596,7 @@ You may also provide an optional regular expression, in 
which case only
 signals matching the regular expression will be included.  For example the
 same expansion will result from only extracting outputs starting with ov:
 
-          /*AUTOOUTPUT(\"^ov\")*/"
+           /*AUTOOUTPUT(\"^ov\")*/"
   (save-excursion
     ;; Point must be at insertion point.
     (let* ((indent-pt (current-indentation))
@@ -12740,7 +12747,7 @@ included.  or excluded if the regexp begins with
 expansion will result from only extracting inputs starting with
 i:
 
-          /*AUTOINPUT(\"^i\")*/"
+           /*AUTOINPUT(\"^i\")*/"
   (save-excursion
     (let* ((indent-pt (current-indentation))
           (params (verilog-read-auto-params 0 1))
@@ -13454,7 +13461,7 @@ Constant signals:
   is put into the AUTOSENSE list and is not desired, use the AUTO_CONSTANT
   declaration anywhere in the module (parenthesis are required):
 
-       /* AUTO_CONSTANT ( \\=`this_is_really_constant_dont_autosense_it ) */
+        /* AUTO_CONSTANT( \\=`this_is_really_constant_dont_autosense_it ) */
 
   Better yet, use a parameter, which will be understood to be constant
   automatically.
@@ -13470,7 +13477,7 @@ OOps!
 An example:
 
            always @ (/*AS*/) begin
-              /*AUTO_CONSTANT (\\=`constant) */
+              /*AUTO_CONSTANT(\\=`constant) */
               outin = ina | inb | \\=`constant;
               out = outin;
            end
@@ -13478,7 +13485,7 @@ An example:
 Typing \\[verilog-auto] will make this into:
 
            always @ (/*AS*/ina or inb) begin
-              /*AUTO_CONSTANT (\\=`constant) */
+              /*AUTO_CONSTANT(\\=`constant) */
               outin = ina | inb | \\=`constant;
               out = outin;
            end
@@ -14134,14 +14141,14 @@ For example:
         endmodule
 
 You can also update the AUTOs from the shell using:
-       emacs --batch  <filenames.v>  -f verilog-batch-auto
+        emacs --batch  <filenames.v>  -f verilog-batch-auto
 Or fix indentation with:
-       emacs --batch  <filenames.v>  -f verilog-batch-indent
+        emacs --batch  <filenames.v>  -f verilog-batch-indent
 Likewise, you can delete or inject AUTOs with:
-       emacs --batch  <filenames.v>  -f verilog-batch-delete-auto
-       emacs --batch  <filenames.v>  -f verilog-batch-inject-auto
+        emacs --batch  <filenames.v>  -f verilog-batch-delete-auto
+        emacs --batch  <filenames.v>  -f verilog-batch-inject-auto
 Or check if AUTOs have the same expansion
-       emacs --batch  <filenames.v>  -f verilog-batch-diff-auto
+        emacs --batch  <filenames.v>  -f verilog-batch-diff-auto
 
 Using \\[describe-function], see also:
     `verilog-auto-arg'          for AUTOARG module instantiations
diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index fef7dff65e..fc0d406f73 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -2197,8 +2197,8 @@ is pair matching KEY."
        (setq alist alist-cdr)))))
 
 (defun vhdl-aget (alist key)
-  "Return the value in ALIST that is associated with KEY.  If KEY is
-not found, then nil is returned."
+  "Return the value in ALIST that is associated with KEY.
+If KEY is not found, then nil is returned."
   (cdr (assoc key alist)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -4275,8 +4275,7 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
 (defvar vhdl-sources-menu nil)
 
 (defun vhdl-directory-files (directory &optional full match)
-  "Call `directory-files' if DIRECTORY exists, otherwise generate error
-message."
+  "Call `directory-files' if DIRECTORY exists, otherwise generate error 
message."
   (if (not (file-directory-p directory))
       (vhdl-warning-when-idle "No such directory: \"%s\"" directory)
     (let ((dir (directory-files directory full match)))
@@ -5734,8 +5733,8 @@ the offset is simply returned."
         (save-excursion (re-search-forward "\\\\" (vhdl-point 'eol) t)))))
 
 (defun vhdl-forward-comment (&optional direction)
-  "Skip all comments (including whitespace).  Skip backwards if DIRECTION is
-negative, skip forward otherwise."
+  "Skip all comments (including whitespace).
+Skip backwards if DIRECTION is negative, skip forward otherwise."
   (interactive "p")
   (if (and direction (< direction 0))
       ;; skip backwards
@@ -6912,9 +6911,9 @@ previous libunit keyword)."
   (concat vhdl-case-alternative-re "\\|" vhdl-case-header-key))
 
 (defun vhdl-skip-case-alternative (&optional lim)
-  "Skip forward over case/when bodies, with optional maximal
-limit.  If no next case alternative is found, nil is returned and
-point is not moved."
+  "Skip forward over case/when bodies, with optional maximal limit.
+If no next case alternative is found, nil is returned and point
+is not moved."
   (let ((lim (or lim (point-max)))
        (here (point))
        donep foundp)
@@ -6939,9 +6938,8 @@ point is not moved."
     foundp))
 
 (defun vhdl-backward-skip-label (&optional lim)
-  "Skip backward over a label, with optional maximal
-limit.  If label is not found, nil is returned and point
-is not moved."
+  "Skip backward over a label, with optional maximal limit.
+If label is not found, nil is returned and point is not moved."
   (let ((lim (or lim (point-min)))
        placeholder)
     (if (save-excursion
@@ -6955,9 +6953,8 @@ is not moved."
     ))
 
 (defun vhdl-forward-skip-label (&optional lim)
-  "Skip forward over a label, with optional maximal
-limit.  If label is not found, nil is returned and point
-is not moved."
+  "Skip forward over a label, with optional maximal limit.
+If label is not found, nil is returned and point is not moved."
   (let ((lim (or lim (point-max))))
     (if (looking-at vhdl-label-key)
        (progn
@@ -7327,9 +7324,9 @@ after the containing paren which starts the arglist."
       (- ce-curcol cs-curcol -1))))
 
 (defun vhdl-lineup-comment (_langelem)
-  "Support old behavior for comment indentation.  We look at
-vhdl-comment-only-line-offset to decide how to indent comment
-only-lines."
+  "Support old behavior for comment indentation.
+We look at `vhdl-comment-only-line-offset' to decide how to
+indent comment only-lines."
   (save-excursion
     (back-to-indentation)
     ;; at or to the right of comment-column
@@ -7445,7 +7442,7 @@ else indent `correctly'."
    (setq this-command 'vhdl-electric-tab)))
 
 (defun vhdl-electric-return ()
-  "newline-and-indent or indent-new-comment-line if in comment and preceding
+  "`newline-and-indent' or `indent-new-comment-line' if in comment and 
preceding
 character is a space."
   (interactive)
   (if (and (= (preceding-char) ? ) (vhdl-in-comment-p))
@@ -7456,8 +7453,8 @@ character is a space."
     (newline-and-indent)))
 
 (defun vhdl-indent-line ()
-  "Indent the current line as VHDL code.  Returns the amount of
-indentation change."
+  "Indent the current line as VHDL code.
+Return the amount of indentation change."
   (interactive)
   (let* ((syntax (and vhdl-indent-syntax-based (vhdl-get-syntactic-context)))
         (pos (- (point-max) (point)))
@@ -7617,8 +7614,8 @@ ALIGN-PATTERN matches the white space to be 
expanded/contracted.")
 ;; Align code
 
 (defvar vhdl-align-try-all-clauses t
-  "If REGEXP is not found on the first line of the region that clause
-is ignored.  If this variable is non-nil, then the clause is tried anyway.")
+  "If REGEXP is not found on the first line of the region that clause is 
ignored.
+If this variable is non-nil, then the clause is tried anyway.")
 
 (defun vhdl-do-group (function &optional spacing)
   "Apply FUNCTION on group of lines between empty lines."
@@ -7637,8 +7634,7 @@ is ignored.  If this variable is non-nil, then the clause 
is tried anyway.")
     (funcall function beg end spacing)))
 
 (defun vhdl-do-list (function &optional spacing)
-  "Apply FUNCTION to the lines of a list surrounded by a balanced group of
-parentheses."
+  "Apply FUNCTION to lines of a list surrounded by a balanced group of 
parentheses."
   (let (beg end)
     (save-excursion
       ;; search for beginning of balanced group of parentheses
@@ -7683,11 +7679,11 @@ parentheses."
     (funcall function beg end spacing)))
 
 (defun vhdl-align-region-1 (begin end &optional spacing alignment-list _indent)
-  "Attempt to align a range of lines based on the content of the
-lines.  The definition of `alignment-list' determines the matching
-order and the manner in which the lines are aligned.  If ALIGNMENT-LIST
-is not specified `vhdl-align-alist' is used.  If INDENT is non-nil,
-indentation is done before aligning."
+  "Attempt to align a range of lines based on the content of the lines.
+The definition of `alignment-list' determines the matching order
+and the manner in which the lines are aligned.  If ALIGNMENT-LIST
+is not specified `vhdl-align-alist' is used.  If INDENT is
+non-nil, indentation is done before aligning."
   (interactive "r\np")
   (setq alignment-list (or alignment-list vhdl-align-alist))
   (setq spacing (or spacing 1))
@@ -11070,7 +11066,7 @@ Point is left between them."
 ;; Help functions
 
 (defun vhdl-electric-space (count)
-  "Expand abbreviations and self-insert space(s), do indent-new-comment-line
+  "Expand abbreviations and self-insert space(s), do `indent-new-comment-line'
 if in comment and past end-comment-column."
   (interactive "p")
   (cond ((vhdl-in-comment-p)
@@ -11619,8 +11615,7 @@ but not if inside a comment or quote."
       string)))
 
 (defun vhdl-paste-group-comment (string indent)
-  "Paste comment and empty lines from STRING between groups of lines
-with INDENT."
+  "Paste comment and empty lines from STRING between groups of lines with 
INDENT."
   (let ((pos (point-marker)))
     (when (> indent 0)
       (while (string-match "^\\(--\\)" string)
@@ -14919,7 +14914,8 @@ if required."
       (setq project-alist (cdr project-alist)))))
 
 (defun vhdl-speedbar-insert-project-hierarchy (project indent &optional rescan)
-  "Insert hierarchy of PROJECT.  Rescan directories if RESCAN is non-nil,
+  "Insert hierarchy of PROJECT.
+Rescan directories if optional argument RESCAN is non-nil,
 otherwise use cached data."
   (when (or rescan (and (not (assoc project vhdl-file-alist))
                        (not (vhdl-load-cache project))))
@@ -14937,7 +14933,8 @@ otherwise use cached data."
   (vhdl-speedbar-expand-units project))
 
 (defun vhdl-speedbar-insert-dir-hierarchy (directory depth &optional rescan)
-  "Insert hierarchy of DIRECTORY.  Rescan directory if RESCAN is non-nil,
+  "Insert hierarchy of DIRECTORY.
+Rescan directory if optional argument RESCAN is non-nil,
 otherwise use cached data."
   (when (or rescan (and (not (assoc directory vhdl-file-alist))
                        (not (vhdl-load-cache directory))))
diff --git a/lisp/progmodes/which-func.el b/lisp/progmodes/which-func.el
index eb170baa5d..8946e2c3f4 100644
--- a/lisp/progmodes/which-func.el
+++ b/lisp/progmodes/which-func.el
@@ -141,12 +141,14 @@ Zero means compute the Imenu menu regardless of size."
                 local-map ,which-func-keymap
                 face which-func
                 mouse-face mode-line-highlight
-                help-echo "mouse-1: go to beginning\n\
-mouse-2: toggle rest visibility\n\
-mouse-3: go to end")
+                 help-echo ,(concat
+                             "Current function\n"
+                             "mouse-1: go to beginning\n"
+                             "mouse-2: toggle rest visibility\n"
+                             "mouse-3: go to end"))
     "]")
   "Format for displaying the function in the mode line."
-  :version "24.2"                  ; added mouse-face; 24point2 is correct
+  :version "28.1"
   :type 'sexp)
 ;;;###autoload (put 'which-func-format 'risky-local-variable t)
 
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 69cabd0b5a..fb8090cfb7 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -307,20 +307,19 @@ recognize and then delegate the work to an external 
process."
 
 
 ;;; misc utilities
-(defun xref--alistify (list key test)
+(defun xref--alistify (list key)
   "Partition the elements of LIST into an alist.
-KEY extracts the key from an element and TEST is used to compare
-keys."
-  (let ((alist '()))
+KEY extracts the key from an element."
+  (let ((table (make-hash-table :test #'equal)))
     (dolist (e list)
       (let* ((k (funcall key e))
-             (probe (cl-assoc k alist :test test)))
+             (probe (gethash k table)))
         (if probe
-            (setcdr probe (cons e (cdr probe)))
-          (push (cons k (list e)) alist))))
+            (puthash k (cons e probe) table)
+          (puthash k (list e) table))))
     ;; Put them back in order.
-    (cl-loop for (key . value) in (reverse alist)
-             collect (cons key (reverse value)))))
+    (cl-loop for key being hash-keys of table using (hash-values value)
+             collect (cons key (nreverse value)))))
 
 (defun xref--insert-propertized (props &rest strings)
   "Insert STRINGS with text properties PROPS."
@@ -760,7 +759,7 @@ references displayed in the current *xref* buffer."
 
 (defun xref--outdated-p (item)
   "Check that the match location at current position is up-to-date.
-ITEMS is an xref item which "
+ITEMS is an xref item which " ; FIXME: Expand documentation.
   ;; FIXME: The check should most likely be a generic function instead
   ;; of the assumption that all matches' summaries relate to the
   ;; buffer text in a particular way.
@@ -967,20 +966,25 @@ XREF-ALIST is of the form ((GROUP . (XREF ...)) ...), 
where
 GROUP is a string for decoration purposes and XREF is an
 `xref-item' object."
   (require 'compile) ; For the compilation faces.
-  (cl-loop for ((group . xrefs) . more1) on xref-alist
+  (cl-loop for (group . xrefs) in xref-alist
            for max-line-width =
            (cl-loop for xref in xrefs
                     maximize (let ((line (xref-location-line
                                           (oref xref location))))
-                               (length (and line (format "%d" line)))))
+                               (and line (1+ (floor (log line 10))))))
            for line-format = (and max-line-width
                                   (format "%%%dd: " max-line-width))
+           with item-text-props = (list 'mouse-face 'highlight
+                                        'keymap xref--button-map
+                                        'help-echo
+                                        (concat "mouse-2: display in another 
window, "
+                                                "RET or mouse-1: follow 
reference"))
            with prev-group = nil
            with prev-line = nil
            do
            (xref--insert-propertized '(face xref-file-header xref-group t)
                                      group "\n")
-           (cl-loop for (xref . more2) on xrefs do
+           (cl-loop for xref in xrefs do
                     (with-slots (summary location) xref
                       (let* ((line (xref-location-line location))
                              (prefix
@@ -996,14 +1000,9 @@ GROUP is a string for decoration purposes and XREF is an
                                    (or (null line)
                                        (not (equal prev-line line))))
                           (insert "\n"))
-                        (xref--insert-propertized
-                         (list 'xref-item xref
-                               'mouse-face 'highlight
-                               'keymap xref--button-map
-                               'help-echo
-                               (concat "mouse-2: display in another window, "
-                                       "RET or mouse-1: follow reference"))
-                         prefix summary)
+                        (xref--insert-propertized (nconc (list 'xref-item xref)
+                                                         item-text-props)
+                                                  prefix summary)
                         (setq prev-line line
                               prev-group group))))
            (insert "\n"))
@@ -1046,8 +1045,7 @@ Return an alist of the form ((GROUP . (XREF ...)) ...)."
   (let* ((alist
           (xref--alistify xrefs
                           (lambda (x)
-                            (xref-location-group (xref-item-location x)))
-                          #'equal))
+                            (xref-location-group (xref-item-location x)))))
          (project (and
                    (eq xref-file-name-display 'project-relative)
                    (project-current)))
@@ -1086,7 +1084,8 @@ Return an alist of the form ((GROUP . (XREF ...)) ...)."
 (defun xref--show-common-initialize (xref-alist fetcher alist)
   (setq buffer-undo-list nil)
   (let ((inhibit-read-only t)
-        (buffer-undo-list t))
+        (buffer-undo-list t)
+        (inhibit-modification-hooks t))
     (erase-buffer)
     (setq overlay-arrow-position nil)
     (xref--insert-xrefs xref-alist)
@@ -1100,7 +1099,8 @@ Return an alist of the form ((GROUP . (XREF ...)) ...)."
   "Refresh the search results in the current buffer."
   (interactive)
   (let ((inhibit-read-only t)
-        (buffer-undo-list t))
+        (buffer-undo-list t)
+        (inhibit-modification-hooks t))
     (save-excursion
       (condition-case err
           (let ((alist (xref--analyze (funcall xref--fetcher))))
@@ -1622,11 +1622,11 @@ IGNORES is a list of glob patterns for files to ignore."
   '((grep
      .
      ;; '-s' because 'git ls-files' can output broken symlinks.
-     "xargs -0 grep <C> -snHE -e <R>")
+     "xargs -0 grep <C> --null -snHE -e <R>")
     (ripgrep
      .
      ;; '!*/' is there to filter out dirs (e.g. submodules).
-     "xargs -0 rg <C> -nH --no-messages -g '!*/' -e <R>"
+     "xargs -0 rg <C> --null -nH --no-messages -g '!*/' -e <R>"
      ))
   "Associative list mapping program identifiers to command templates.
 
@@ -1831,18 +1831,20 @@ Such as the current syntax table and the applied syntax 
properties."
 
 (defun xref--convert-hits (hits regexp)
   (let (xref--last-file-buffer
-        (tmp-buffer (generate-new-buffer " *xref-temp*")))
+        (tmp-buffer (generate-new-buffer " *xref-temp*"))
+        (remote-id (file-remote-p default-directory))
+        (syntax-needed (xref--regexp-syntax-dependent-p regexp)))
     (unwind-protect
-        (mapcan (lambda (hit) (xref--collect-matches hit regexp tmp-buffer))
+        (mapcan (lambda (hit)
+                  (xref--collect-matches hit regexp tmp-buffer remote-id 
syntax-needed))
                 hits)
       (kill-buffer tmp-buffer))))
 
-(defun xref--collect-matches (hit regexp tmp-buffer)
+(defun xref--collect-matches (hit regexp tmp-buffer remote-id syntax-needed)
   (pcase-let* ((`(,line ,file ,text) hit)
-               (remote-id (file-remote-p default-directory))
                (file (and file (concat remote-id file)))
                (buf (xref--find-file-buffer file))
-               (syntax-needed (xref--regexp-syntax-dependent-p regexp)))
+               (inhibit-modification-hooks t))
     (if buf
         (with-current-buffer buf
           (save-excursion
diff --git a/lisp/rect.el b/lisp/rect.el
index 504be41b67..d288adfbaf 100644
--- a/lisp/rect.el
+++ b/lisp/rect.el
@@ -202,8 +202,8 @@ rectangles, as conses of the form (WIDTH . HEIGHT)."
              (<= (+ y2 h2) y1)))))
 
 (defun rectangle-dimensions (start end)
-  "Return the dimensions of the rectangle with corners at START
-and END. The returned value has the form of (WIDTH . HEIGHT)."
+  "Return the dimensions of the rectangle with corners at START and END.
+The returned value has the form of (WIDTH . HEIGHT)."
   (save-excursion
     (let* ((height (1+ (abs (- (line-number-at-pos end)
                                (line-number-at-pos start)))))
diff --git a/lisp/repeat.el b/lisp/repeat.el
index 0b761fff1e..ee9e14b515 100644
--- a/lisp/repeat.el
+++ b/lisp/repeat.el
@@ -218,7 +218,7 @@ recently executed command not bound to an input event\"."
    ((null last-repeatable-command)
     (error "There is nothing to repeat"))
    ((eq last-repeatable-command 'mode-exit)
-    (error "last-repeatable-command is mode-exit & can't be repeated"))
+    (error "`last-repeatable-command' is `mode-exit' and can't be repeated"))
    ((memq last-repeatable-command repeat-too-dangerous)
     (error "Command %S too dangerous to repeat automatically"
           last-repeatable-command)))
diff --git a/lisp/replace.el b/lisp/replace.el
index e4155d4c27..84ec042f45 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -63,7 +63,7 @@ it will match any sequence matched by the regexp 
`search-whitespace-regexp'."
   :version "24.3")
 
 (defvar query-replace-history nil
-  "Default history list for query-replace commands.
+  "Default history list for `query-replace' commands.
 See `query-replace-from-history-variable' and
 `query-replace-to-history-variable'.")
 
@@ -202,7 +202,7 @@ by this function to the end of values available via
                   (car (symbol-value query-replace-from-history-variable)))))
 
 (defun query-replace-read-from (prompt regexp-flag)
-  "Query and return the `from' argument of a query-replace operation.
+  "Query and return the `from' argument of a `query-replace' operation.
 Prompt with PROMPT.  REGEXP-FLAG non-nil means the response should be a regexp.
 The return value can also be a pair (FROM . TO) indicating that the user
 wants to replace FROM with TO."
@@ -326,8 +326,9 @@ the original string if not."
 
 
 (defun query-replace-read-to (from prompt regexp-flag)
-  "Query and return the `to' argument of a query-replace operation.
-Prompt with PROMPT.  REGEXP-FLAG non-nil means the response should a regexp."
+  "Query and return the `to' argument of a `query-replace' operation.
+Prompt with PROMPT.  REGEXP-FLAG non-nil means the response
+should a regexp."
   (query-replace-compile-replacement
    (save-excursion
      (let* ((history-add-new-input nil)
@@ -1300,7 +1301,7 @@ See `occur-revert-function'.")
 (defcustom occur-mode-find-occurrence-hook nil
   "Hook run by Occur after locating an occurrence.
 This will be called with the cursor position at the occurrence.  An application
-for this is to reveal context in an outline-mode when the occurrence is 
hidden."
+for this is to reveal context in an outline mode when the occurrence is 
hidden."
   :type 'hook
   :group 'matching)
 
@@ -2606,7 +2607,7 @@ passed in.  If LITERAL is set, no checking is done, 
anyway."
   noedit)
 
 (defvar replace-update-post-hook nil
-  "Function(s) to call after query-replace has found a match in the buffer.")
+  "Function(s) to call after `query-replace' has found a match in the buffer.")
 
 (defvar replace-search-function nil
   "Function to use when searching for strings to replace.
diff --git a/lisp/ruler-mode.el b/lisp/ruler-mode.el
index a0d4f6e96c..84c9d06ece 100644
--- a/lisp/ruler-mode.el
+++ b/lisp/ruler-mode.el
@@ -348,7 +348,7 @@ nothing is dragged.")
 (defun ruler-mode-text-scaled-width (width)
   "Compute scaled text width according to current font scaling.
 Convert a width of char units into a text-scaled char width units,
-Ex. `window-hscroll'."
+for example `window-hscroll'."
   (/ (* width (frame-char-width)) (default-font-width)))
 
 (defun ruler-mode-text-scaled-window-hscroll ()
diff --git a/lisp/server.el b/lisp/server.el
index 5dd30db195..6359a76199 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -1078,7 +1078,7 @@ The following commands are accepted by the client:
 
 `-suspend'
   Suspend this terminal, i.e., stop the client process.
-  Sent when the user presses C-z."
+  Sent when the user presses \\[suspend-frame]."
   (server-log (concat "Received " string) proc)
   ;; First things first: let's check the authentication
   (unless (process-get proc :authenticated)
diff --git a/lisp/ses.el b/lisp/ses.el
index 9250f7ede0..ea966295b1 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -299,11 +299,11 @@ Used for listing local printers or renamed cells.")
     ses-center-span ses-dashfill ses-dashfill-span
     ses-tildefill-span
     ses-prin1)
-  "List of print functions to be included in initial history of
-printer functions.  None of these standard-printer functions,
-except function `ses-prin1', is suitable for use as a column
-printer or a global-default printer because they invoke the
-column or default printer and then modify its output.")
+  "List of print functions to be included in initial history of printer 
functions.
+None of these standard-printer functions, except function
+`ses-prin1', is suitable for use as a column printer or a
+global-default printer because they invoke the column or default
+printer and then modify its output.")
 
 
 ;;----------------------------------------------------------------------------
diff --git a/lisp/shell.el b/lisp/shell.el
index 5cdc0385a6..b575024e01 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -517,7 +517,8 @@ Shell buffers.  It implements `shell-completion-execonly' 
for
 (put 'shell-mode 'mode-class 'special)
 
 (define-derived-mode shell-mode comint-mode "Shell"
-  "Major mode for interacting with an inferior shell.\\<shell-mode-map>
+  "Major mode for interacting with an inferior shell.
+\\<shell-mode-map>
 \\[comint-send-input] after the end of the process' output sends the text from
     the end of process to the end of the current line.
 \\[comint-send-input] before end of process output copies the current line 
minus the prompt to
diff --git a/lisp/simple.el b/lisp/simple.el
index 1267c92fe5..298e3ea5ee 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -241,7 +241,7 @@ all other buffers."
 (defun next-error-buffer-on-selected-frame (&optional _avoid-current
                                                       extra-test-inclusive
                                                       extra-test-exclusive)
-  "Return a single visible next-error buffer on the selected frame."
+  "Return a single visible `next-error' buffer on the selected frame."
   (let ((window-buffers
          (delete-dups
           (delq nil (mapcar (lambda (w)
@@ -2133,21 +2133,23 @@ or (if one of MODES is a minor mode), if it is switched 
on in BUFFER."
      command-names)))
 
 (defcustom suggest-key-bindings t
-  "Non-nil means show the equivalent key-binding when M-x command has one.
+  "Non-nil means show the equivalent keybinding when \
+\\[execute-extended-command] has one.
 The value can be a length of time to show the message for.
 If the value is non-nil and not a number, we wait 2 seconds.
 
 Also see `extended-command-suggest-shorter'.
 
 Equivalent key-bindings are also shown in the completion list of
-M-x for all commands that have them."
+\\[execute-extended-command] for all commands that have them."
   :group 'keyboard
   :type '(choice (const :tag "off" nil)
                  (integer :tag "time" 2)
                  (other :tag "on")))
 
 (defcustom extended-command-suggest-shorter t
-  "If non-nil, show a shorter M-x invocation when there is one.
+  "If non-nil, show a shorter \\[execute-extended-command] invocation \
+when there is one.
 
 Also see `suggest-key-bindings'."
   :group 'keyboard
@@ -3522,7 +3524,7 @@ with < or <= based on USE-<."
 ;; called or in some cases on a timer called after a change is made in
 ;; any buffer.
 (defvar-local undo-auto--last-boundary-cause nil
-  "Describe the cause of the last undo-boundary.
+  "Describe the cause of the last `undo-boundary'.
 
 If `explicit', the last boundary was caused by an explicit call to
 `undo-boundary', that is one not called by the code in this
@@ -9817,11 +9819,13 @@ warning using STRING as the message.")
 
 The argument `COMMAND' should be a symbol.
 
-Running `M-x COMMAND RET' for the first time prompts for which
+Running `\\[execute-extended-command] COMMAND RET' for \
+the first time prompts for which
 alternative to use and records the selected command as a custom
 variable.
 
-Running `C-u M-x COMMAND RET' prompts again for an alternative
+Running `\\[universal-argument] \\[execute-extended-command] COMMAND RET' \
+prompts again for an alternative
 and overwrites the previous choice.
 
 The variable `COMMAND-alternatives' contains an alist with
diff --git a/lisp/so-long.el b/lisp/so-long.el
index 0cc6e884b8..c975384ddb 100644
--- a/lisp/so-long.el
+++ b/lisp/so-long.el
@@ -8,7 +8,7 @@
 ;; Keywords: convenience
 ;; Created: 23 Dec 2015
 ;; Package-Requires: ((emacs "24.4"))
-;; Version: 1.1.1
+;; Version: 1.1.2
 
 ;; This file is part of GNU Emacs.
 
@@ -410,6 +410,7 @@
 
 ;; * Change Log:
 ;;
+;; 1.1.2 - Use `so-long-mode-line-active' face on `mode-name' in 
`so-long-mode'.
 ;; 1.1.1 - Identical to 1.1, but fixing an incorrect GNU ELPA release.
 ;; 1.1   - Utilise `buffer-line-statistics' in Emacs 28+, with the new
 ;;         `so-long-predicate' function `so-long-statistics-excessive-p'.
@@ -447,7 +448,7 @@
 ;; 0.7.5 - Documentation.
 ;;       - Added sgml-mode and nxml-mode to `so-long-target-modes'.
 ;; 0.7.4 - Refactored the handling of `whitespace-mode'.
-;; 0.7.3 - Added customize group `so-long' with user options.
+;; 0.7.3 - Added customization group `so-long' with user options.
 ;;       - Added `so-long-original-values' to generalise the storage and
 ;;         restoration of values from the original mode upon `so-long-revert'.
 ;;       - Added `so-long-revert-hook'.
@@ -477,7 +478,7 @@
              '(so-long ("1.0" . "27.1")
                        ("1.1" . "28.1")))
 
-(defconst so-long--latest-version "1.1")
+(defconst so-long--latest-version "1.1.2")
 
 (declare-function buffer-line-statistics "fns.c" t t) ;; Emacs 28+
 (declare-function longlines-mode "longlines")
@@ -568,7 +569,7 @@ See `so-long-detected-long-line-p' for details."
 
 (defcustom so-long-target-modes
   '(prog-mode css-mode sgml-mode nxml-mode fundamental-mode)
-  "`so-long' affects only these modes and their derivatives.
+  "`global-so-long-mode' affects only these modes and their derivatives.
 
 Our primary use-case is minified programming code, so `prog-mode' covers
 most cases, but there are some exceptions to this.
@@ -615,7 +616,9 @@ the mentioned options might interfere with some intended 
processing."
 (defcustom so-long-predicate (if (fboundp 'buffer-line-statistics)
                                  'so-long-statistics-excessive-p
                                'so-long-detected-long-line-p)
-  "Function, called after `set-auto-mode' to decide whether action is needed.
+  "Function called after `set-auto-mode' to decide whether action is needed.
+
+This affects the behaviour of `global-so-long-mode'.
 
 Only called if the major mode is a member of `so-long-target-modes'.
 
@@ -750,6 +753,8 @@ If ACTION-ARG is provided, it is used in place of 
`so-long-action'."
 (defcustom so-long-file-local-mode-function 'so-long-mode-downgrade
   "Function to call during `set-auto-mode' when a file-local mode is set.
 
+This affects the behaviour of `global-so-long-mode'.
+
 The specified function will be called with a single argument, being the
 file-local mode which was established.
 
@@ -761,8 +766,8 @@ place of `so-long-mode' -- therefore respecting the 
file-local mode value, yet
 still overriding minor modes and variables (as if `so-long-action' had been set
 to `so-long-minor-mode').
 
-The value `so-long-inhibit' means that `so-long' will not take any action at 
all
-for this file.
+The value `so-long-inhibit' means that `global-so-long-mode' will not take any
+action at all for this file.
 
 If nil, then do not treat files with file-local modes any differently to other
 files.
@@ -965,7 +970,12 @@ If nil, no mode line indicator will be displayed."
 
 (defface so-long-mode-line-active
   '((t :inherit mode-line-emphasis))
-  "Face for `so-long-mode-line-info' when mitigations are active."
+  "Face for the mode line construct when mitigations are active.
+
+Applied to `mode-name' in the `so-long-mode' major mode, and to
+`so-long-mode-line-label' otherwise (for non-major-mode actions).
+
+See also `so-long-mode-line-info'."
   :package-version '(so-long . "1.0"))
 
 (defface so-long-mode-line-inactive
@@ -1090,7 +1100,7 @@ This command calls `so-long' with the selected action as 
an argument.")
 
 ;;;###autoload
 (defun so-long-commentary ()
-  "View the `so-long' documentation in `outline-mode'."
+  "View the `so-long' library's documentation in `outline-mode'."
   (interactive)
   (let ((buf "*So Long: Commentary*"))
     (when (buffer-live-p (get-buffer buf))
@@ -1130,7 +1140,7 @@ This command calls `so-long' with the selected action as 
an argument.")
 
 ;;;###autoload
 (defun so-long-customize ()
-  "Open the `so-long' customize group."
+  "Open the customization group `so-long'."
   (interactive)
   (customize-group 'so-long))
 
@@ -1351,7 +1361,8 @@ This minor mode is a standard `so-long-action' option."
   "Major mode keymap and menu for `so-long-mode'.")
 
 ;;;###autoload
-(define-derived-mode so-long-mode nil "So Long"
+(define-derived-mode so-long-mode nil
+  (propertize "So Long" 'face 'so-long-mode-line-active)
   "This major mode is the default `so-long-action' option.
 
 The normal reason for this mode being active is that `global-so-long-mode' is
@@ -1375,7 +1386,8 @@ values), despite potential performance issues, type 
\\[so-long-revert].
 
 Use \\[so-long-commentary] for more information.
 
-Use \\[so-long-customize] to configure the behaviour."
+Use \\[so-long-customize] to open the customization group `so-long' to
+configure the behaviour."
   ;; Housekeeping.  `so-long-mode' might be invoked directly rather than via
   ;; `so-long', so replicate the necessary behaviours.  We could use this same
   ;; test in `so-long-after-change-major-mode' to run `so-long-hook', but 
that's
@@ -1583,7 +1595,7 @@ because we do not want to downgrade the major mode in 
that scenario."
             so-long-revert-function 'turn-off-so-long-minor-mode))))
 
 (defun so-long-inhibit (&optional _mode)
-  "Prevent `so-long' from having any effect at all.
+  "Prevent `global-so-long-mode' from having any effect.
 
 This is a `so-long-file-local-mode-function' option."
   (setq so-long--inhibited t))
@@ -1642,12 +1654,13 @@ function defined by `so-long-file-local-mode-function'."
                                    "-mode"))
                    modes))))
 
-    ;; `so-long' now processes the resulting mode list.  If any modes were
-    ;; listed, we assume that one of them is a major mode.  It's possible that
-    ;; this isn't true, but the buffer would remain in fundamental-mode if that
-    ;; were the case, so it is very unlikely.  For the purposes of passing a
-    ;; value to `so-long-handle-file-local-mode' we assume the major mode was
-    ;; the first mode specified (in which case it is the last in the list).
+    ;; Now process the resulting mode list for `so-long--set-auto-mode'.
+    ;; If any modes were listed, we assume that one of them is a major mode.
+    ;; It's possible that this isn't true, but the buffer would remain in
+    ;; fundamental-mode if that were the case, so it is very unlikely.
+    ;; For the purposes of passing a value to `so-long-handle-file-local-mode'
+    ;; we assume the major mode was the first mode specified (in which case it
+    ;; is the last in the list).
     (when modes
       (so-long-handle-file-local-mode (car (last modes))))))
 
@@ -1661,7 +1674,7 @@ function defined by `so-long-file-local-mode-function'."
   ;; (advice-add 'hack-local-variables :around #'so-long--hack-local-variables)
   ;;
   ;; See also "Files with a file-local 'mode'" in the Commentary.
-  "Ensure that `so-long' defers to file-local mode declarations if necessary.
+  "Enable `global-so-long-mode' to defer to file-local mode declarations.
 
 If a file-local mode is detected, then we call the function defined by
 `so-long-file-local-mode-function'.
@@ -1673,7 +1686,7 @@ File-local header comments are currently an exception, 
and are processed by
 `so-long--check-header-modes' (see which for details)."
   ;; The first arg to `hack-local-variables' is HANDLE-MODE since Emacs 26.1,
   ;; and MODE-ONLY in earlier versions.  In either case we are interested in
-  ;; whether it has the value `t'.
+  ;; whether it has the value t.
   (let ((retval (apply orig-fun handle-mode args)))
     (and (eq handle-mode t)
          retval ; A file-local mode was set.
@@ -1685,7 +1698,8 @@ File-local header comments are currently an exception, 
and are processed by
   ;; (advice-add 'set-auto-mode :around #'so-long--set-auto-mode)
   "Maybe call `so-long' for files with very long lines.
 
-This advice acts after `set-auto-mode' has set the buffer's major mode.
+This advice acts after `set-auto-mode' has set the buffer's major mode, if
+`global-so-long-mode' is enabled.
 
 We can't act before this point, because some major modes must be exempt
 \(binary file modes, for example).  Instead, we act only when the selected
@@ -1880,7 +1894,8 @@ When such files are detected by `so-long-predicate', we 
invoke the selected
 
 Use \\[so-long-commentary] for more information.
 
-Use \\[so-long-customize] to configure the behaviour."
+Use \\[so-long-customize] to open the customization group `so-long' to
+configure the behaviour."
   :global t
   :group 'so-long
   (if global-so-long-mode
@@ -2065,13 +2080,13 @@ If it appears in `%s', you should remove it."
 ;; M-x ispell-buffer (using aspell).
 
 ; LocalWords:  LocalWords british ispell aspell hunspell emacs elisp el init 
dir
-; LocalWords:  customize customized customizing Customization globalized 
amongst
+; LocalWords:  customize customized customizing customization Customization 
prog
 ; LocalWords:  initialized profiler boolean minified pre redisplay config 
keymap
 ; LocalWords:  noerror selectable mapc sgml nxml hl flydiff defs arg Phil 
Sainty
 ; LocalWords:  defadvice nadvice whitespace ie bos eos eobp origmode un Un setq
 ; LocalWords:  docstring auf Wiedersehen longlines alist autoload Refactored 
Inc
 ; LocalWords:  MERCHANTABILITY RET REGEXP VAR ELPA WS mitigations EmacsWiki 
eval
-; LocalWords:  rx filename filenames js defun bidi bpa prog FIXME
+; LocalWords:  rx filename filenames js defun bidi bpa FIXME globalized amongst
 
 ;; So long, farewell, auf Wiedersehen, goodbye
 ;; You have to go, this code is minified
diff --git a/lisp/sort.el b/lisp/sort.el
index be373fba99..d6767ed509 100644
--- a/lisp/sort.el
+++ b/lisp/sort.el
@@ -507,7 +507,8 @@ Use \\[untabify] to convert tabs to spaces before sorting."
       (setq col-start (min col-beg1 col-end1))
       (setq col-end (max col-beg1 col-end1))
       (if (search-backward "\t" beg1 t)
-         (error "sort-columns does not work with tabs -- use M-x untabify"))
+          (error (substitute-command-keys
+                  "sort-columns does not work with tabs -- use \\[untabify]")))
       (if (not (or (memq system-type '(windows-nt))
                   (let ((pos beg1) plist fontified)
                     (catch 'found
diff --git a/lisp/subr.el b/lisp/subr.el
index a2266b1d57..2d2794cfd1 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -22,6 +22,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 ;; declare-function's args use &rest, not &optional, for compatibility
@@ -166,8 +168,8 @@ variables are literal symbols and should not be quoted.
 
 The second VALUE is not computed until after the first VARIABLE
 is set, and so on; each VALUE can use the new value of variables
-set earlier in the ‘setq-local’.  The return value of the
-‘setq-local’ form is the value of the last VALUE.
+set earlier in the `setq-local'.  The return value of the
+`setq-local' form is the value of the last VALUE.
 
 \(fn [VARIABLE VALUE]...)"
   (declare (debug setq))
@@ -4665,13 +4667,24 @@ rather than your caller's match data."
              '(set-match-data save-match-data-internal 'evaporate))))
 
 (defun match-string (num &optional string)
-  "Return string of text matched by last search.
-NUM specifies which parenthesized expression in the last regexp.
- Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
-Zero means the entire text matched by the whole regexp or whole string.
-STRING should be given if the last search was by `string-match' on STRING.
-If STRING is nil, the current buffer should be the same buffer
-the search/match was performed in."
+  "Return the string of text matched by the previous search or regexp 
operation.
+NUM specifies the number of the parenthesized sub-expression in the last
+regexp whose match to return.  Zero means return the text matched by the
+entire regexp or the whole string.
+
+The return value is nil if NUMth pair didn't match anything, or if there
+were fewer than NUM sub-expressions in the regexp used in the search.
+
+STRING should be given if the last search was by `string-match'
+on STRING.  If STRING is nil, the current buffer should be the
+same buffer as the one in which the search/match was performed.
+
+Note that many functions in Emacs modify the match data, so this
+function should be called \"close\" to the function that did the
+regexp search.  In particular, saying (for instance)
+`M-: (looking-at \"[0-9]\") RET' followed by `M-: (match-string 0) RET'
+interactively is seldom meaningful, since the Emacs command loop
+may modify the match data."
   (declare (side-effect-free t))
   (if (match-beginning num)
       (if string
@@ -4937,25 +4950,25 @@ Unless optional argument INPLACE is non-nil, return a 
new string."
          (aset newstr i tochar)))
     newstr))
 
-(defun string-replace (fromstring tostring instring)
-  "Replace FROMSTRING with TOSTRING in INSTRING each time it occurs."
+(defun string-replace (from-string to-string in-string)
+  "Replace FROM-STRING with TO-STRING in IN-STRING each time it occurs."
   (declare (pure t) (side-effect-free t))
-  (when (equal fromstring "")
+  (when (equal from-string "")
     (signal 'wrong-length-argument '(0)))
   (let ((start 0)
         (result nil)
         pos)
-    (while (setq pos (string-search fromstring instring start))
+    (while (setq pos (string-search from-string in-string start))
       (unless (= start pos)
-        (push (substring instring start pos) result))
-      (push tostring result)
-      (setq start (+ pos (length fromstring))))
+        (push (substring in-string start pos) result))
+      (push to-string result)
+      (setq start (+ pos (length from-string))))
     (if (null result)
         ;; No replacements were done, so just return the original string.
-        instring
+        in-string
       ;; Get any remaining bit.
-      (unless (= start (length instring))
-        (push (substring instring start) result))
+      (unless (= start (length in-string))
+        (push (substring in-string start) result))
       (apply #'concat (nreverse result)))))
 
 (defun replace-regexp-in-string (regexp rep string &optional
@@ -5995,7 +6008,7 @@ print the reporter message followed by the word \"done\".
            (,count 0)
            (,list ,(cadr spec)))
        (when (stringp ,prep)
-         (setq ,prep (make-progress-reporter ,prep 0 (1- (length ,list)))))
+         (setq ,prep (make-progress-reporter ,prep 0 (length ,list))))
        (dolist (,(car spec) ,list)
          ,@body
          (progress-reporter-update ,prep (setq ,count (1+ ,count))))
@@ -6426,4 +6439,12 @@ This is intended for internal use only."
          (:success t)
          (json-unavailable nil))))
 
+(defun ensure-list (object)
+  "Return OBJECT as a list.
+If OBJECT is already a list, return OBJECT itself.  If it's
+not a list, return a one-element list containing OBJECT."
+  (if (listp object)
+      object
+    (list object)))
+
 ;;; subr.el ends here
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 5abc25b203..d0a1b3b70b 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -310,8 +310,7 @@ that closes only when clicked on the close button."
       (define-key-after menu [duplicate-tab]
         `(menu-item "Duplicate" (lambda () (interactive)
                                   (tab-bar-duplicate-tab
-                                   nil ;; TODO: add ,tab-number
-                                   ))
+                                   nil ,tab-number))
                     :help "Duplicate the tab"))
       (define-key-after menu [close]
         `(menu-item "Close" (lambda () (interactive)
@@ -903,7 +902,8 @@ on the tab bar instead."
                 (if (consp current)
                     (seq-reduce (lambda (current param)
                                   (assq-delete-all param current))
-                                '(wc wc-point wc-bl wc-bbl wc-history-back 
wc-history-forward)
+                                '(wc wc-point wc-bl wc-bbl
+                                  wc-history-back wc-history-forward)
                                 (copy-sequence current))
                   current))
               current)
@@ -915,8 +915,10 @@ on the tab bar instead."
   (let* ((tab (tab-bar--current-tab-find nil frame))
          (tab-explicit-name (alist-get 'explicit-name tab))
          (tab-group (alist-get 'group tab))
-         (bl  (seq-filter #'buffer-live-p (frame-parameter frame 
'buffer-list)))
-         (bbl (seq-filter #'buffer-live-p (frame-parameter frame 
'buried-buffer-list))))
+         (bl  (seq-filter #'buffer-live-p (frame-parameter
+                                           frame 'buffer-list)))
+         (bbl (seq-filter #'buffer-live-p (frame-parameter
+                                           frame 'buried-buffer-list))))
     `(tab
       (name . ,(if tab-explicit-name
                    (alist-get 'name tab)
@@ -930,8 +932,18 @@ on the tab bar instead."
       (wc-point . ,(point-marker))
       (wc-bl . ,bl)
       (wc-bbl . ,bbl)
-      (wc-history-back . ,(gethash (or frame (selected-frame)) 
tab-bar-history-back))
-      (wc-history-forward . ,(gethash (or frame (selected-frame)) 
tab-bar-history-forward)))))
+      (wc-history-back . ,(gethash (or frame (selected-frame))
+                                   tab-bar-history-back))
+      (wc-history-forward . ,(gethash (or frame (selected-frame))
+                                      tab-bar-history-forward))
+      ;; Copy other possible parameters
+      ,@(mapcan (lambda (param)
+                  (unless (memq (car param)
+                                '(name explicit-name group time
+                                  ws wc wc-point wc-bl wc-bbl
+                                  wc-history-back wc-history-forward))
+                    (list param)))
+                (cdr tab)))))
 
 (defun tab-bar--current-tab (&optional tab frame)
   (tab-bar--current-tab-make (or tab (tab-bar--current-tab-find nil frame))))
@@ -951,7 +963,15 @@ on the tab bar instead."
                    (alist-get 'name tab)
                  (funcall tab-bar-tab-name-function)))
       (explicit-name . ,tab-explicit-name)
-      ,@(if tab-group `((group . ,tab-group))))))
+      ,@(if tab-group `((group . ,tab-group)))
+      ;; Copy other possible parameters
+      ,@(mapcan (lambda (param)
+                  (unless (memq (car param)
+                                '(name explicit-name group time
+                                  ws wc wc-point wc-bl wc-bbl
+                                  wc-history-back wc-history-forward))
+                    (list param)))
+                (cdr tab)))))
 
 (defun tab-bar--current-tab-find (&optional tabs frame)
   (assq 'current-tab (or tabs (funcall tab-bar-tabs-function frame))))
@@ -1276,15 +1296,19 @@ After the tab is created, the hooks in
     (unless tab-bar-mode
       (message "Added new tab at %s" tab-bar-new-tab-to))))
 
-(defun tab-bar-new-tab (&optional arg)
+(defun tab-bar-new-tab (&optional arg from-number)
   "Create a new tab ARG positions to the right.
 If a negative ARG, create a new tab ARG positions to the left.
 If ARG is zero, create a new tab in place of the current tab.
 If no ARG is specified, then add a new tab at the position
 specified by `tab-bar-new-tab-to'.
 Argument addressing is relative in contrast to `tab-bar-new-tab-to'
-where argument addressing is absolute."
+where argument addressing is absolute.
+If FROM-NUMBER is a tab number, a new tab is created from that tab."
   (interactive "P")
+  (when from-number
+    (let ((inhibit-message t))
+      (tab-bar-select-tab from-number)))
   (if arg
       (let* ((tabs (funcall tab-bar-tabs-function))
              (from-index (or (tab-bar--current-tab-index tabs) 0))
@@ -1292,13 +1316,13 @@ where argument addressing is absolute."
         (tab-bar-new-tab-to (1+ to-index)))
     (tab-bar-new-tab-to)))
 
-(defun tab-bar-duplicate-tab (&optional arg)
+(defun tab-bar-duplicate-tab (&optional arg from-number)
   "Duplicate the current tab to ARG positions to the right.
-ARG has the same meaning as in `tab-bar-new-tab'."
+ARG and FROM-NUMBER have the same meaning as in `tab-bar-new-tab'."
   (interactive "P")
   (let ((tab-bar-new-tab-choice nil)
         (tab-bar-new-tab-group t))
-    (tab-bar-new-tab arg)))
+    (tab-bar-new-tab arg from-number)))
 
 
 (defvar tab-bar-closed-tabs nil
diff --git a/lisp/tempo.el b/lisp/tempo.el
index 25f54af3c9..b722cc04ca 100644
--- a/lisp/tempo.el
+++ b/lisp/tempo.el
@@ -445,7 +445,7 @@ never prompted."
 ;;; tempo-is-user-element
 
 (defun tempo-is-user-element (element)
-  "Tries all the user-defined element handlers in `tempo-user-elements'."
+  "Try all the user-defined element handlers in `tempo-user-elements'."
   ;; Sigh... I need (some list)
   (catch 'found
     (mapc (lambda (handler)
diff --git a/lisp/term.el b/lisp/term.el
index 42b2e5a248..af93089104 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -340,7 +340,7 @@
 (defvar term-home-marker) ; Marks the "home" position for cursor addressing.
 (defvar term-saved-home-marker nil
   "When using alternate sub-buffer,
-contains saved term-home-marker from original sub-buffer.")
+contains saved `term-home-marker' from original sub-buffer.")
 (defvar term-start-line-column 0
   "(current-column) at start of screen line, or nil if unknown.")
 (defvar term-current-column 0 "If non-nil, is cache for (current-column).")
@@ -377,7 +377,7 @@ are not allowed.")
 (defvar term-scroll-with-delete nil
   "If t, forward scrolling should be implemented by delete to
 top-most line(s); and if nil, scrolling should be implemented
-by moving term-home-marker.  It is set to t if there is a
+by moving `term-home-marker'.  It is set to t if there is a
 \(non-default) scroll-region OR the alternate buffer is used.")
 (defvar term-pending-delete-marker) ; New user input in line mode
        ; needs to be deleted, because it gets echoed by the inferior.
@@ -669,7 +669,7 @@ Do not change it directly; use `term-set-escape-char' 
instead.")
   "Keymap used in Term pager mode.")
 
 (defvar term-ptyp t
-  "True if communications via pty; false if by pipe.  Buffer local.
+  "Non-nil if communications via pty; false if by pipe.  Buffer local.
 This is to work around a bug in Emacs process signaling.")
 
 (defvar term-last-input-match ""
@@ -1228,8 +1228,7 @@ Entry to this mode runs the hooks on `term-mode-hook'."
       (process-send-string proc chars))))
 
 (defun term-send-raw ()
-  "Send the last character typed through the terminal-emulator
-without any interpretation."
+  "Send last typed character to the terminal-emulator without any 
interpretation."
   (interactive)
   (let ((keys (this-command-keys)))
     (term-send-raw-string (string (aref keys (1- (length keys)))))))
@@ -1401,8 +1400,8 @@ Called as a buffer-local `read-only-mode-hook' function."
   (force-mode-line-update))
 
 (defun term-check-proc (buffer)
-  "True if there is a process associated w/buffer BUFFER, and it
-is alive.  BUFFER can be either a buffer or the name of one."
+  "Non-nil if there is a process associated w/buffer BUFFER, and it is alive.
+BUFFER can be either a buffer or the name of one."
   (let ((proc (get-buffer-process buffer)))
     (and proc (memq (process-status proc) '(run stop open listen connect)))))
 
@@ -1538,7 +1537,7 @@ Using \"emacs\" loses, because bash disables editing if 
$TERM == emacs.")
 Some other integer if Bash is new or not in use.
 Nil if unknown.")
 (defun term--bash-needs-EMACSp ()
-  "t if Bash is old, nil if it is new or not in use."
+  "Return t if Bash is old, nil if it is new or not in use."
   (eq 43
       (or term--bash-needs-EMACS-status
           (setf
@@ -2107,17 +2106,17 @@ The values of `term-get-old-input', 
`term-input-filter-functions', and
 in the buffer.  E.g.,
 
 If the interpreter is the csh,
-    term-get-old-input is the default: take the current line, discard any
-        initial string matching regexp term-prompt-regexp.
-    term-input-filter-functions monitors input for \"cd\", \"pushd\", and
+    `term-get-old-input' is the default: take the current line, discard any
+        initial string matching regexp `term-prompt-regexp'.
+    `term-input-filter-functions' monitors input for \"cd\", \"pushd\", and
        \"popd\" commands.  When it sees one, it cd's the buffer.
-    term-input-filter is the default: returns t if the input isn't all white
+    `term-input-filter' is the default: returns t if the input isn't all white
        space.
 
 If the term is Lucid Common Lisp,
-    term-get-old-input snarfs the sexp ending at point.
-    term-input-filter-functions does nothing.
-    term-input-filter returns nil if the input matches input-filter-regexp,
+    `term-get-old-input' snarfs the sexp ending at point.
+    `term-input-filter-functions' does nothing.
+    `term-input-filter' returns nil if the input matches input-filter-regexp,
         which matches (1) all whitespace (2) :a, :c, etc.
 
 Similarly for Soar, Scheme, etc."
@@ -2403,8 +2402,7 @@ Useful if you accidentally suspend the top-level process."
       (kill-region pmark (point)))))
 
 (defun term-delchar-or-maybe-eof (arg)
-  "Delete ARG characters forward, or send an EOF to process if at end of
-buffer."
+  "Delete ARG characters forward, or send an EOF to process if at end of 
buffer."
   (interactive "p")
   (if (eobp)
       (process-send-eof)
@@ -3171,7 +3169,7 @@ See `term-prompt-regexp'."
 Set in `pre-command-hook' in char mode by `term-set-goto-process-mark'.")
 
 (defun term-set-goto-process-mark ()
-  "Sets `term-goto-process-mark'.
+  "Set `term-goto-process-mark'.
 
 Always set to nil if `term-char-mode-point-at-process-mark' is nil.
 
@@ -3430,7 +3428,7 @@ option is enabled.  See `term-set-goto-process-mark'."
    (t)))
 
 (defun term--reset-scroll-region ()
-  "Sets the scroll region to the full height of the terminal."
+  "Set the scroll region to the full height of the terminal."
   (term-set-scroll-region 0 (term--last-line)))
 
 (defun term-set-scroll-region (top bottom)
@@ -3793,7 +3791,7 @@ all pending output has been dealt with."))
 
 (defun term-erase-in-display (kind)
   "Erase (that is blank out) part of the window.
-If KIND is 0, erase from (point) to (point-max);
+If KIND is 0, erase from point to point-max;
 if KIND is 1, erase from home to point; else erase from home to point-max."
   (term-handle-deferred-scroll)
   (cond ((eq kind 0)
@@ -4322,8 +4320,7 @@ Try to be nice by providing useful defaults and history."
                     "Speed (default nil = set by port): ")
                    (h
                     (format-prompt "Speed" (format "%s b/s" h)))
-                   (t
-                   (format "Speed (b/s): ")))
+                   (t "Speed (b/s): "))
              nil nil nil '(history . 1) nil nil)))
     (when (or (null x) (and (stringp x) (zerop (length x))))
       (setq x h))
diff --git a/lisp/textmodes/bib-mode.el b/lisp/textmodes/bib-mode.el
index e2fd3ecaa4..a429aae7f7 100644
--- a/lisp/textmodes/bib-mode.el
+++ b/lisp/textmodes/bib-mode.el
@@ -137,7 +137,7 @@ with the cdr.")
 
 
 (defcustom bib-auto-capitalize t
-  "True to automatically capitalize appropriate fields in Bib mode."
+  "Non-nil to automatically capitalize appropriate fields in Bib mode."
   :type 'boolean)
 
 (defconst bib-capitalized-fields "%[AETCBIJR]")
diff --git a/lisp/textmodes/etc-authors-mode.el 
b/lisp/textmodes/etc-authors-mode.el
new file mode 100644
index 0000000000..a591b2db97
--- /dev/null
+++ b/lisp/textmodes/etc-authors-mode.el
@@ -0,0 +1,133 @@
+;;; etc-authors-mode.el --- font-locking for etc/AUTHORS  -*- lexical-binding: 
t -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; Author: Stefan Kangas <stefan@marxist.se>
+;; Keywords: internal
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Major mode to display the etc/AUTHORS file from the Emacs
+;; distribution.  Provides some basic font locking and not much else.
+
+;;; Code:
+
+(defgroup etc-authors-mode nil
+  "Display the \"etc/AUTHORS\" file from the Emacs distribution."
+  :version "28.1"
+  :group 'internal)
+
+(defface etc-authors-default '((t :inherit variable-pitch))
+  "Default face used to display the \"etc/AUTHORS\" file.
+See also `etc-authors-mode'."
+  :version "28.1")
+
+(defface etc-authors-author '((((class color) (min-colors 88) (background 
light))
+                    :foreground "midnight blue"
+                    :weight bold :height 1.05
+                    :inherit variable-pitch)
+                   (((class color) (min-colors 88) (background dark))
+                    :foreground "cyan"
+                    :weight bold :height 1.05
+                    :inherit variable-pitch)
+                   (((supports :weight bold) (supports :height 1.05))
+                    :weight bold :height 1.05
+                    :inherit variable-pitch)
+                   (((supports :weight bold))
+                    :weight bold :inherit variable-pitch)
+                   (t :inherit variable-pitch))
+  "Face used for the author in the \"etc/AUTHORS\" file.
+See also `etc-authors-mode'."
+  :version "28.1")
+
+(defface etc-authors-descriptor '((((class color) (min-colors 88) (background 
light))
+                        :foreground "sienna" :inherit variable-pitch)
+                       (((class color) (min-colors 88) (background dark))
+                        :foreground "peru" :inherit variable-pitch)
+                       (t :inherit variable-pitch))
+  "Face used for the description text in the \"etc/AUTHORS\" file.
+See also `etc-authors-mode'."
+  :version "28.1")
+
+(defface etc-authors-other-files '((t :inherit etc-authors-descriptor))
+  "Face used for the \"other files\" text in the \"etc/AUTHORS\" file.
+See also `etc-authors-mode'."
+  :version "28.1")
+
+(defconst etc-authors--author-re
+  (rx bol (group (not (any blank "\n")) (+? (not (any ":" "\n")))) ":")
+  "Regexp matching an author in \"etc/AUTHORS\".")
+
+(defvar etc-authors-mode-font-lock-keywords
+  `((,etc-authors--author-re
+     1 'etc-authors-author)
+    (,(rx (or "wrote"
+              (seq (? "and ") (or "co-wrote" "changed"))))
+     0 'etc-authors-descriptor)
+    (,(rx "and " (+ digit) " other files")
+     0 'etc-authors-other-files)
+    (,(rx bol (not space) (+ not-newline) eol)
+     0 'etc-authors-default)))
+
+(defun etc-authors-mode--hide-local-variables ()
+  "Hide local variables in \"etc/AUTHORS\".  Used by `etc-authors-mode'."
+  (narrow-to-region (point-min)
+                    (save-excursion
+                      (goto-char (point-min))
+                      ;; Obfuscate to avoid this being interpreted
+                      ;; as a local variable section itself.
+                      (if (re-search-forward "^Local\sVariables:$" nil t)
+                          (progn (forward-line -1) (point))
+                        (point-max)))))
+
+(defun etc-authors-next-author (&optional arg)
+  "Move point to the next author in \"etc/AUTHORS\".
+With a prefix arg ARG, move point that many authors forward."
+  (interactive "p" etc-authors-mode)
+  (if (< 0 arg)
+      (progn
+        (when (looking-at etc-authors--author-re)
+          (forward-line 1))
+        (re-search-forward etc-authors--author-re nil t arg))
+    (when (looking-at etc-authors--author-re)
+          (forward-line -1))
+    (re-search-backward etc-authors--author-re nil t (abs arg)))
+  (goto-char (line-beginning-position)))
+
+(defun etc-authors-prev-author (&optional arg)
+  "Move point to the previous author in \"etc/AUTHORS\".
+With a prefix arg ARG, move point that many authors backward."
+  (interactive "p" etc-authors-mode)
+  (etc-authors-next-author (- arg)))
+
+(defvar etc-authors-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "n" #'etc-authors-next-author)
+    (define-key map "p" #'etc-authors-prev-author)
+    map)
+  "Keymap for `etc-authors-mode'.")
+
+;;;###autoload
+(define-derived-mode etc-authors-mode special-mode "Authors View"
+  "Major mode for viewing \"etc/AUTHORS\" from the Emacs distribution.
+Provides some basic font locking and not much else."
+  (setq-local font-lock-defaults
+              '(etc-authors-mode-font-lock-keywords nil nil ((?_ . "w"))))
+  (setq font-lock-multiline nil)
+  (etc-authors-mode--hide-local-variables))
+
+(provide 'etc-authors-mode)
+;;; etc-authors-mode.el ends here
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index 9b3211df57..1d450b5001 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -1861,7 +1861,7 @@ is itself incorrect, but suspiciously repeated."
 ;;*    flyspell-highlight-duplicate-region ...                          */
 ;;*---------------------------------------------------------------------*/
 (defun flyspell-highlight-duplicate-region (beg end poss)
-  "Set up an overlay on a duplicate misspelled word, in the buffer from BEG to 
END.
+  "Set up overlay on duplicate misspelled word, in the buffer from BEG to END.
 POSS is a list of possible spelling/correction lists,
 as returned by `ispell-parse-output'."
   (let ((inhibit-read-only t))
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 5842bf5f9f..b650ab3871 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -758,8 +758,7 @@ See `ispell-buffer-with-debug' for an example of use."
   (let ((ispell-debug-buffer (get-buffer-create "*ispell-debug*")))
     (with-current-buffer ispell-debug-buffer
       (if append
-         (insert
-          (format "-----------------------------------------------\n"))
+         (insert "-----------------------------------------------\n")
        (erase-buffer)))
     ispell-debug-buffer))
 
diff --git a/lisp/textmodes/makeinfo.el b/lisp/textmodes/makeinfo.el
index 13367a09bc..6b9b3f3e9d 100644
--- a/lisp/textmodes/makeinfo.el
+++ b/lisp/textmodes/makeinfo.el
@@ -175,10 +175,9 @@ command to gain use of `next-error'."
              'makeinfo-compilation-sentinel-region)))))))
 
 (defun makeinfo-next-error (_arg _reset)
-  "This function is used to disable `next-error' if the user has
-used `makeinfo-region'.  Since the compilation process is used on
-a temporary file in that case, calling `next-error' would give
-nonsensical results."
+  "This is used to disable `next-error' if the user has used `makeinfo-region'.
+Since the compilation process is used on a temporary file in that
+case, calling `next-error' would give nonsensical results."
   (error "Use `makeinfo-buffer' to gain use of the `next-error' command"))
 
 ;; Actually run makeinfo.  COMMAND is the command to run.  If
diff --git a/lisp/textmodes/mhtml-mode.el b/lisp/textmodes/mhtml-mode.el
index 2590538568..936732153a 100644
--- a/lisp/textmodes/mhtml-mode.el
+++ b/lisp/textmodes/mhtml-mode.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (eval-when-compile (require 'cl-lib))
diff --git a/lisp/textmodes/refill.el b/lisp/textmodes/refill.el
index 0a0e4cc444..b2ebbd5f37 100644
--- a/lisp/textmodes/refill.el
+++ b/lisp/textmodes/refill.el
@@ -153,7 +153,7 @@ regardless of the number of after-change calls from 
commands doing
 complex processing.")
 
 (defun refill-after-change-function (_beg end _len)
-  "Function for `after-change-functions' which just sets `refill-doit'."
+  "Set `refill-doit'.  Used by `after-change-functions'."
   (unless undo-in-progress
     (setq refill-doit end)))
 
diff --git a/lisp/textmodes/reftex-dcr.el b/lisp/textmodes/reftex-dcr.el
index abcf119fb8..ee26d911a5 100644
--- a/lisp/textmodes/reftex-dcr.el
+++ b/lisp/textmodes/reftex-dcr.el
@@ -32,14 +32,17 @@
 
 ;;;###autoload
 (defun reftex-view-crossref (&optional arg auto-how fail-quietly)
-  "View cross reference of macro at point.  Point must be on the KEY
-argument.  When at a `\\ref' macro, show corresponding `\\label'
-definition, also in external documents (`xr').  When on a label, show
-a locations where KEY is referenced.  Subsequent calls find additional
-locations.  When on a `\\cite', show the associated `\\bibitem' macro or
-the BibTeX database entry.  When on a `\\bibitem', show a `\\cite' macro
-which uses this KEY. When on an `\\index', show other locations marked
-by the same index entry.
+  "View cross reference of macro at point.
+
+Point must be on the KEY argument.  When at a `\\ref' macro, show
+corresponding `\\label' definition, also in external
+documents (`xr').  When on a label, show a locations where KEY is
+referenced.  Subsequent calls find additional locations.  When on
+a `\\cite', show the associated `\\bibitem' macro or the BibTeX
+database entry.  When on a `\\bibitem', show a `\\cite' macro
+which uses this KEY.  When on an `\\index', show other locations
+marked by the same index entry.
+
 To define additional cross referencing items, use the option
 `reftex-view-crossref-extra'.  See also `reftex-view-crossref-from-bibtex'.
 With one or two \\[universal-argument] prefixes, enforce rescanning of the 
document.
diff --git a/lisp/textmodes/reftex-global.el b/lisp/textmodes/reftex-global.el
index 3b7518e5c3..cc8b3244b9 100644
--- a/lisp/textmodes/reftex-global.el
+++ b/lisp/textmodes/reftex-global.el
@@ -338,17 +338,17 @@ Also checks if buffers visiting the files are in 
read-only mode."
     (while (setq file (pop files))
       (unless (file-exists-p file)
         (ding)
-        (or (y-or-n-p (format "No such file %s. Continue? " file))
+        (or (y-or-n-p (format "No such file %s. Continue?" file))
             (error "Abort")))
       (unless (file-writable-p file)
         (ding)
-        (or (y-or-n-p (format "No write access to %s. Continue? " file))
+        (or (y-or-n-p (format "No write access to %s. Continue?" file))
             (error "Abort")))
       (when (and (setq buf (find-buffer-visiting file))
                  (with-current-buffer buf
                    buffer-read-only))
         (ding)
-        (or (y-or-n-p (format "Buffer %s is read-only. Continue? "
+        (or (y-or-n-p (format "Buffer %s is read-only. Continue?"
                               (buffer-name buf)))
             (error "Abort"))))))
 
diff --git a/lisp/textmodes/reftex-index.el b/lisp/textmodes/reftex-index.el
index a6df4fb7af..9d9eab4d7b 100644
--- a/lisp/textmodes/reftex-index.el
+++ b/lisp/textmodes/reftex-index.el
@@ -934,8 +934,8 @@ When index is restricted, select the previous section as 
restriction criterion."
      (t nil))))
 
 (defun reftex-index-analyze-entry (data)
-  ;; This splits the index context so that key, attribute and visual
-  ;; values are accessible individually.
+  "Split index context so that key, attribute and visual
+values are accessible individually."
   (interactive)
   (let* ((arg (nth 5 data))
          (context (nth 2 data))
@@ -1666,7 +1666,7 @@ this function repeatedly."
          (repeat
           (princ (format "  Index entry:  %s\n" phrase)))
          (t
-          (princ (format "    Index key:  <<Given by the match>>\n"))))
+          (princ "    Index key:  <<Given by the match>>\n")))
         (princ (format "      Example:  %s\n" example))
         (terpri)
         (princ (format "Total matches:  %s in %s\n"
diff --git a/lisp/textmodes/reftex-parse.el b/lisp/textmodes/reftex-parse.el
index 9def10cee0..c521a07f19 100644
--- a/lisp/textmodes/reftex-parse.el
+++ b/lisp/textmodes/reftex-parse.el
@@ -435,7 +435,8 @@ This function also makes sure the old toc markers do not 
point anywhere."
 ;;;###autoload
 (defun reftex-section-info (file)
   "Return a section entry for the current match.
-Careful: This function expects the match-data to be still in place!"
+Careful: This function expects the `match-data' to still be in
+place!"
   (let* ((marker (set-marker (make-marker) (1- (match-beginning 3))))
          (macro (reftex-match-string 3))
          (prefix (save-match-data
@@ -494,7 +495,8 @@ will rescan the entire document."
 ;;;###autoload
 (defun reftex-index-info (file)
   "Return an index entry for the current match.
-Careful: This function expects the match-data to be still in place!"
+Careful: This function expects the `match-data' to still be in
+place!"
   (catch 'exit
     (let* ((macro (reftex-match-string 10))
            (bom (match-beginning 10))
diff --git a/lisp/textmodes/reftex-vars.el b/lisp/textmodes/reftex-vars.el
index 23f2193501..d57a767855 100644
--- a/lisp/textmodes/reftex-vars.el
+++ b/lisp/textmodes/reftex-vars.el
@@ -330,7 +330,8 @@ select the nearest entry with the correct new level."
   "The maximum level of toc entries which will be included in the TOC.
 Section headings with a bigger level will be ignored.  In RefTeX, chapters
 are level 1, sections are level 2 etc.
-This variable can be changed from within the *toc* buffer with the `t' key."
+This variable can be changed from within the *toc* buffer with \
+\\<reftex-toc-mode-map>\\[reftex-toc-max-level]."
   :group 'reftex-table-of-contents-browser
   :type 'integer)
 
@@ -1208,7 +1209,7 @@ path."
   :type '(repeat (file)))
 
 (defcustom reftex-sort-bibtex-matches 'reverse-year
-  "Sorting of the entries found in BibTeX databases by reftex-citation.
+  "Sorting of the entries found in BibTeX databases by `reftex-citation'.
 Possible values:
 nil            Do not sort entries.
 `author'       Sort entries by author name.
@@ -1364,7 +1365,7 @@ should return the string to insert into the buffer."
   :type '(choice (const nil) function))
 
 (defcustom reftex-select-bib-mode-hook nil
-  "Mode hook for reftex-select-bib-mode."
+  "Mode hook for `reftex-select-bib-mode'."
   :group 'reftex-citation-support
   :type 'hook)
 
@@ -1840,7 +1841,7 @@ upon the variable `reftex-initialize-temporary-buffers'."
 
 (defcustom reftex-initialize-temporary-buffers nil
   "Non-nil means do initializations even when visiting file temporarily.
-When nil, RefTeX may turn off find-file hooks and other stuff to briefly
+When nil, RefTeX may turn off `find-file' hooks and other stuff to briefly
 visit a file.
 When t, the full default initializations are done (find-file-hook etc.).
 Instead of t or nil, this variable may also be a list of hook functions to
diff --git a/lisp/textmodes/reftex.el b/lisp/textmodes/reftex.el
index c926b05634..f7424b60b3 100644
--- a/lisp/textmodes/reftex.el
+++ b/lisp/textmodes/reftex.el
@@ -1208,7 +1208,7 @@ Valid actions are: readable, restore, read, kill, write."
         (if (file-writable-p file)
             (with-temp-file file
               (message "Writing parse file %s" (abbreviate-file-name file))
-              (insert (format ";; RefTeX parse info file\n"))
+              (insert ";; RefTeX parse info file\n")
               (insert (format ";; File: %s\n" master))
               (insert (format ";; User: %s (%s)\n\n"
                               (user-login-name) (user-full-name)))
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el
index c8748e3740..6fd66b2502 100644
--- a/lisp/textmodes/tex-mode.el
+++ b/lisp/textmodes/tex-mode.el
@@ -3454,7 +3454,7 @@ There might be text before point."
     ("\\varprime" . ?′)
     ("\\varpropto" . ?∝)
     ("\\varrho" . ?ϱ)
-    ("\\varsigma" ?ς)
+    ("\\varsigma" . ?ς)
     ("\\vartriangleleft" . ?⊲)
     ("\\vartriangleright" . ?⊳)
     ("\\vdash" . ?⊢)
diff --git a/lisp/textmodes/texinfmt.el b/lisp/textmodes/texinfmt.el
index 604a67df32..550994cd7b 100644
--- a/lisp/textmodes/texinfmt.el
+++ b/lisp/textmodes/texinfmt.el
@@ -932,9 +932,9 @@ commands."
   "Text of the copyright notice and copying permissions.")
 
 (defun texinfo-copying ()
-  "Copy the copyright notice and copying permissions from the Texinfo file,
-as indicated by the @copying ... @end copying command;
-insert the text with the @insertcopying command."
+  "Copy the copyright notice and copying permissions from Texinfo file.
+This is indicated by the \"@copying ... @end copying\" command;
+insert the text with the \"@insertcopying\" command."
   (let ((beg (progn (beginning-of-line) (point)))
         (end  (progn (re-search-forward "^@end copying[ \t]*\n") (point))))
     (setq texinfo-copying-text
@@ -944,8 +944,8 @@ insert the text with the @insertcopying command."
     (delete-region beg end)))
 
 (defun texinfo-insertcopying ()
-  "Insert the copyright notice and copying permissions from the Texinfo file,
-which are indicated by the @copying ... @end copying command."
+  "Insert the copyright notice and copying permissions from Texinfo file.
+This is indicated by the \"@copying ... @end copying\" command."
   (insert (concat "\n" texinfo-copying-text)))
 
 (put 'begin 'texinfo-format 'texinfo-format-begin)
@@ -2546,7 +2546,9 @@ If used within a line, follow `@bullet' with braces."
    "smalllisp"
    "\\)")
   "Regexp specifying end of environments in which @kbd does not put `...'
-around argument. (See `texinfo-format-kbd-regexp')")
+around argument.
+
+See `texinfo-format-kbd-regexp'.")
 
 (put 'kbd 'texinfo-format 'texinfo-format-kbd)
 (defun texinfo-format-kbd ()
diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el
index 0af6d56ccc..efe33982c3 100644
--- a/lisp/thingatpt.el
+++ b/lisp/thingatpt.el
@@ -151,15 +151,6 @@ positions of the thing found."
                (if (and (<= real-beg orig) (<= orig end) (< real-beg end))
                    (cons real-beg end))))))))))
 
-;;;###autoload
-(defun thing-at-mouse (event thing &optional no-properties)
-  "Return the THING at mouse click.
-Like `thing-at-point', but tries to use the event
-where the mouse button is clicked to find a thing nearby."
-  (save-excursion
-    (mouse-set-point event)
-    (thing-at-point thing no-properties)))
-
 ;;;###autoload
 (defun thing-at-point (thing &optional no-properties)
   "Return the THING at point.
@@ -196,6 +187,24 @@ a symbol as a valid THING."
         (set-text-properties 0 (length text) nil text))
       text)))
 
+;;;###autoload
+(defun bounds-of-thing-at-mouse (event thing)
+  "Determine start and end locations for THING at mouse click given by EVENT.
+Like `bounds-of-thing-at-point', but tries to use the position in EVENT
+where the mouse button is clicked to find the thing nearby."
+  (save-excursion
+    (mouse-set-point event)
+    (bounds-of-thing-at-point thing)))
+
+;;;###autoload
+(defun thing-at-mouse (event thing &optional no-properties)
+  "Return the THING at mouse click specified by EVENT.
+Like `thing-at-point', but tries to use the position in EVENT
+where the mouse button is clicked to find the thing nearby."
+  (save-excursion
+    (mouse-set-point event)
+    (thing-at-point thing no-properties)))
+
 ;; Go to beginning/end
 
 (defun beginning-of-thing (thing)
@@ -275,18 +284,29 @@ The bounds of THING are determined by 
`bounds-of-thing-at-point'."
 
 (put 'list 'bounds-of-thing-at-point 'thing-at-point-bounds-of-list-at-point)
 
-(defun thing-at-point-bounds-of-list-at-point ()
+(defun thing-at-point-bounds-of-list-at-point (&optional escape-strings 
no-syntax-crossing)
   "Return the bounds of the list at point.
 Prefer the enclosing list with fallback on sexp at point.
 \[Internal function used by `bounds-of-thing-at-point'.]"
   (save-excursion
-    (if (ignore-errors (up-list -1))
+    (if (ignore-errors (up-list -1 escape-strings no-syntax-crossing))
        (ignore-errors (cons (point) (progn (forward-sexp) (point))))
       (let ((bound (bounds-of-thing-at-point 'sexp)))
        (and bound
             (<= (car bound) (point)) (< (point) (cdr bound))
             bound)))))
 
+(put 'list-or-string 'bounds-of-thing-at-point
+     'thing-at-point-bounds-of-list-or-string-at-point)
+
+(defun thing-at-point-bounds-of-list-or-string-at-point ()
+  "Return the bounds of the list or string at point.
+Like `thing-at-point-bounds-of-list-at-point', but if
+point is inside a string that's enclosed in the list, this
+function will return the enclosed string and not the
+enclosing list."
+  (thing-at-point-bounds-of-list-at-point t t))
+
 ;; Defuns
 
 (put 'defun 'beginning-op 'beginning-of-defun)
diff --git a/lisp/transient.el b/lisp/transient.el
index 2be82f56d8..f3d3902a77 100644
--- a/lisp/transient.el
+++ b/lisp/transient.el
@@ -1289,8 +1289,8 @@ variable instead.")
 
 (defvar transient--exitp nil "Whether to exit the transient.")
 (defvar transient--showp nil "Whether the transient is show in a popup 
buffer.")
-(defvar transient--helpp nil "Whether help-mode is active.")
-(defvar transient--editp nil "Whether edit-mode is active.")
+(defvar transient--helpp nil "Whether `help-mode' is active.")
+(defvar transient--editp nil "Whether `edit-mode' is active.")
 
 (defvar transient--active-infix nil "The active infix awaiting user input.")
 
diff --git a/lisp/url/url-auth.el b/lisp/url/url-auth.el
index 06cfacc99d..2d9a7758f1 100644
--- a/lisp/url/url-auth.el
+++ b/lisp/url/url-auth.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-vars)
@@ -458,8 +460,7 @@ information associated with them.")
 
 ;;;###autoload
 (defun url-get-authentication (url realm type prompt &optional args)
-  "Return an authorization string suitable for use in the WWW-Authenticate
-header in an HTTP/1.0 request.
+  "Return authorization string for the WWW-Authenticate header in HTTP/1.0 
request.
 
 URL    is the url you are requesting authorization to.  This can be either a
        string representing the URL, or the parsed representation returned by
diff --git a/lisp/url/url-cache.el b/lisp/url/url-cache.el
index 830e6ba9dc..f869d2e2cf 100644
--- a/lisp/url/url-cache.el
+++ b/lisp/url/url-cache.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-parse)
@@ -47,7 +49,7 @@ Used by the function `url-cache-expired'."
          (file-directory-p (file-name-directory file)))))
 
 (defun url-cache-prepare (file)
-  "Makes it possible to cache data in FILE.
+  "Make it possible to cache data in FILE.
 Creates any necessary parent directories, deleting any non-directory files
 that would stop this.  Returns nil if parent directories can not be
 created.  If FILE already exists as a non-directory, it changes
diff --git a/lisp/url/url-cid.el b/lisp/url/url-cid.el
index 0ca2d8a073..3095f7bd2c 100644
--- a/lisp/url/url-cid.el
+++ b/lisp/url/url-cid.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-vars)
diff --git a/lisp/url/url-dired.el b/lisp/url/url-dired.el
index 398113db13..feb7c50ce5 100644
--- a/lisp/url/url-dired.el
+++ b/lisp/url/url-dired.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (autoload 'dired-get-filename "dired")
diff --git a/lisp/url/url-expand.el b/lisp/url/url-expand.el
index 05088e3cac..4e737e965d 100644
--- a/lisp/url/url-expand.el
+++ b/lisp/url/url-expand.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-methods)
diff --git a/lisp/url/url-gw.el b/lisp/url/url-gw.el
index d2bf843fc3..caffa6fb7b 100644
--- a/lisp/url/url-gw.el
+++ b/lisp/url/url-gw.el
@@ -21,6 +21,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-vars)
diff --git a/lisp/url/url-handlers.el b/lisp/url/url-handlers.el
index ed0402a513..650c610e04 100644
--- a/lisp/url/url-handlers.el
+++ b/lisp/url/url-handlers.el
@@ -102,6 +102,7 @@
 
 ;;;###autoload
 (define-minor-mode url-handler-mode
+  ;; Can't use "\\[find-file]" below as it produces "[open]":
   "Handle URLs as if they were file names throughout Emacs.
 After switching on this minor mode, Emacs file primitives handle
 URLs.  For instance:
diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el
index c4a29ebe10..44ebedeeae 100644
--- a/lisp/url/url-http.el
+++ b/lisp/url/url-http.el
@@ -225,7 +225,7 @@ request.")
         (os-info (unless (and (listp url-privacy-level)
                               (memq 'os url-privacy-level))
                    (format "(%s; %s)" url-system-type url-os-type)))
-        (url-info (format "URL/Emacs")))
+        (url-info "URL/Emacs"))
     (string-join (delq nil (list package-info url-info
                                  emacs-info os-info))
                  " ")))
@@ -462,53 +462,53 @@ Return the number of characters removed."
     ;; credentials to the server, and they were wrong, so just give
     ;; up.
     (let ((authorization (assoc "Authorization" url-http-extra-headers)))
-      (when (and authorization
-                (not (string-match "^NTLM " (cdr authorization))))
-       (error "Wrong authorization used for %s" url)))
-
-    ;; find strongest supported auth
-    (dolist (this-auth auths)
-      (setq this-auth (url-eat-trailing-space
-                      (url-strip-leading-spaces
-                       this-auth)))
-      (let* ((this-type
-             (downcase (if (string-match "[ \t]" this-auth)
-                            (substring this-auth 0 (match-beginning 0))
-                          this-auth)))
-            (registered (url-auth-registered this-type))
-            (this-strength (cddr registered)))
-       (when (and registered (> this-strength strength))
-         (setq auth this-auth
-               type this-type
-               strength this-strength))))
-
-    (if (not (url-auth-registered type))
-       (progn
-         (widen)
-         (goto-char (point-max))
-         (insert "<hr>Sorry, but I do not know how to handle " (or type auth 
url "")
-                 " authentication.  If you'd like to write it,"
-                 " please use M-x report-emacs-bug RET.<hr>")
-          ;; We used to set a `status' var (declared "special") but I can't
-          ;; find the corresponding let-binding, so it's probably an error.
-          ;; FIXME: Maybe it was supposed to set `success', i.e. to return t?
-          ;; (setq status t)
-          nil) ;; Not success yet.
-
-      (let* ((args (url-parse-args (subst-char-in-string ?, ?\; auth)))
-            (auth (url-get-authentication auth-url
-                                          (cdr-safe (assoc "realm" args))
-                                          type t args)))
-       (if (not auth)
-            t                           ;Success.
-         (push (cons (if proxy "Proxy-Authorization" "Authorization") auth)
-               url-http-extra-headers)
-         (let ((url-request-method url-http-method)
-               (url-request-data url-http-data)
-               (url-request-extra-headers url-http-extra-headers))
-           (url-retrieve-internal url url-callback-function
-                                  url-callback-arguments))
-          nil))))) ;; Not success yet.
+      (if (and authorization
+               (not (string-match "^NTLM " (cdr authorization)))) ;Bug#43566
+          t ;; Instruct caller to signal an error.  Bug#50511
+        ;; Find strongest supported auth.
+        (dolist (this-auth auths)
+          (setq this-auth (url-eat-trailing-space
+                           (url-strip-leading-spaces
+                            this-auth)))
+          (let* ((this-type
+                  (downcase (if (string-match "[ \t]" this-auth)
+                                (substring this-auth 0 (match-beginning 0))
+                              this-auth)))
+                 (registered (url-auth-registered this-type))
+                 (this-strength (cddr registered)))
+            (when (and registered (> this-strength strength))
+              (setq auth this-auth
+                    type this-type
+                    strength this-strength))))
+
+        (if (not (url-auth-registered type))
+            (progn
+              (widen)
+              (goto-char (point-max))
+              (insert "<hr>Sorry, but I do not know how to handle "
+                      (or type auth url "")
+                      " authentication.  If you'd like to write it,"
+                      " please use M-x report-emacs-bug RET.<hr>")
+              ;; We used to set a `status' var (declared "special") but I can't
+              ;; find the corresponding let-binding, so it's probably an error.
+              ;; FIXME: Maybe it was supposed to set `success', i.e. to return 
t?
+              ;; (setq status t)
+              nil) ;; Not success yet.
+
+          (let* ((args (url-parse-args (subst-char-in-string ?, ?\; auth)))
+                 (auth (url-get-authentication auth-url
+                                               (cdr-safe (assoc "realm" args))
+                                               type t args)))
+            (if (not auth)
+                t                           ;Success.
+              (push (cons (if proxy "Proxy-Authorization" "Authorization") 
auth)
+                    url-http-extra-headers)
+              (let ((url-request-method url-http-method)
+                    (url-request-data url-http-data)
+                    (url-request-extra-headers url-http-extra-headers))
+                (url-retrieve-internal url url-callback-function
+                                       url-callback-arguments))
+              nil))))))) ;; Not success yet.
 
 (defun url-http-parse-response ()
   "Parse just the response code."
diff --git a/lisp/url/url-ldap.el b/lisp/url/url-ldap.el
index d26562b7f1..5d18f85fad 100644
--- a/lisp/url/url-ldap.el
+++ b/lisp/url/url-ldap.el
@@ -218,7 +218,7 @@ URL can be a URL string, or a URL record of the type 
returned by
                                    "</td></tr>\n")
                          ;; Multiple matches, slightly uglier
                          (insert "   <tr>\n"
-                                 (format "    <td valign=top>")
+                                 "    <td valign=top>"
                                  (url-ldap-attribute-pretty-name (car attr)) 
"</td><td>"
                                  (mapconcat (lambda (x)
                                               (url-ldap-attribute-pretty-desc 
(car attr) x))
diff --git a/lisp/url/url-misc.el b/lisp/url/url-misc.el
index fe2393beb6..c741b6c85a 100644
--- a/lisp/url/url-misc.el
+++ b/lisp/url/url-misc.el
@@ -20,6 +20,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-vars)
diff --git a/lisp/url/url-news.el b/lisp/url/url-news.el
index 4fe909cadb..c9216862b0 100644
--- a/lisp/url/url-news.el
+++ b/lisp/url/url-news.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-vars)
diff --git a/lisp/url/url-privacy.el b/lisp/url/url-privacy.el
index d926775c48..58ae6efbfc 100644
--- a/lisp/url/url-privacy.el
+++ b/lisp/url/url-privacy.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-vars)
diff --git a/lisp/url/url-proxy.el b/lisp/url/url-proxy.el
index c89c1b6bc3..0ffe51616d 100644
--- a/lisp/url/url-proxy.el
+++ b/lisp/url/url-proxy.el
@@ -19,6 +19,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (require 'url-parse)
diff --git a/lisp/url/url-vars.el b/lisp/url/url-vars.el
index f0d70ff6e7..d916a71e41 100644
--- a/lisp/url/url-vars.el
+++ b/lisp/url/url-vars.el
@@ -20,6 +20,8 @@
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
 
+;;; Commentary:
+
 ;;; Code:
 
 (defgroup url nil
diff --git a/lisp/vc/compare-w.el b/lisp/vc/compare-w.el
index 7c2e125831..29dfaa7668 100644
--- a/lisp/vc/compare-w.el
+++ b/lisp/vc/compare-w.el
@@ -188,7 +188,7 @@ If both windows display the same buffer,
 the mark is pushed twice in that buffer:
 first in the other window, then in the selected window.
 
-A prefix arg means reverse the value of variable
+A prefix arg IGNORE-WHITESPACE, means reverse the value of variable
 `compare-ignore-whitespace'.  If `compare-ignore-whitespace' is
 nil, then a prefix arg means ignore changes in whitespace.  If
 `compare-ignore-whitespace' is non-nil, then a prefix arg means
diff --git a/lisp/vc/diff.el b/lisp/vc/diff.el
index 7bb1151602..352fa693ff 100644
--- a/lisp/vc/diff.el
+++ b/lisp/vc/diff.el
@@ -87,10 +87,10 @@ minibuffer.  The default for NEW is the current buffer's 
file
 name, and the default for OLD is a backup file for NEW, if one
 exists.  If NO-ASYNC is non-nil, call diff synchronously.
 
-When called interactively with a prefix argument, prompt
+When called interactively with a prefix argument SWITCHES, prompt
 interactively for diff switches.  Otherwise, the switches
-specified in the variable `diff-switches' are passed to the
-diff command.
+specified in the variable `diff-switches' are passed to the diff
+command.
 
 Non-interactively, OLD and NEW may each be a file or a buffer."
   (interactive
@@ -229,7 +229,7 @@ returns the buffer used."
 Uses the latest backup, if there are several numerical backups.
 If this file is a backup, diff it with its original.
 The backup file is the first file given to `diff'.
-With prefix arg, prompt for diff switches."
+With prefix arg SWITCHES, prompt for diff switches."
   (interactive (list (read-file-name "Diff (file with backup): ")
                     (diff-switches)))
   (let (bak ori)
@@ -243,7 +243,7 @@ With prefix arg, prompt for diff switches."
 
 ;;;###autoload
 (defun diff-latest-backup-file (fn)
-  "Return the latest existing backup of FILE, or nil."
+  "Return the latest existing backup of file FN, or nil."
   (let ((handler (find-file-name-handler fn 'diff-latest-backup-file)))
     (if handler
        (funcall handler 'diff-latest-backup-file fn)
diff --git a/lisp/vc/ediff-diff.el b/lisp/vc/ediff-diff.el
index 0f90bef2c5..68abea794f 100644
--- a/lisp/vc/ediff-diff.el
+++ b/lisp/vc/ediff-diff.el
@@ -103,8 +103,8 @@ Use `setq-default' if setting it in .emacs")
 GNU diff3 doesn't have such an option."
   :type 'string)
 
-;; the actual options used in comparison
-(ediff-defvar-local ediff-actual-diff-options ediff-diff-options "")
+(ediff-defvar-local ediff-actual-diff-options ediff-diff-options
+  "The actual options used in comparison.")
 
 (defcustom ediff-custom-diff-program ediff-diff-program
   "Program to use for generating custom diff output for saving it in a file.
@@ -123,8 +123,8 @@ This output is not used by Ediff internally."
   :set 'ediff-set-diff-options
   :type 'string)
 
-;; the actual options used in comparison
-(ediff-defvar-local ediff-actual-diff3-options ediff-diff3-options "")
+(ediff-defvar-local ediff-actual-diff3-options ediff-diff3-options
+  "The actual options used in comparison.")
 
 (defcustom ediff-diff3-ok-lines-regexp
   "^\\([1-3]:\\|====\\|  \\|.*Warning *:\\|.*No newline\\|.*missing 
newline\\|^\C-m$\\)"
@@ -132,16 +132,16 @@ This output is not used by Ediff internally."
 Lines that do not match are assumed to be error messages."
   :type 'regexp)
 
-;; keeps the status of the current diff in 3-way jobs.
-;; the status can be =diff(A), =diff(B), or =diff(A+B)
-(ediff-defvar-local ediff-diff-status "" "")
+(ediff-defvar-local ediff-diff-status ""
+  "Keeps the status of the current diff in 3-way jobs.
+The status can be =diff(A), =diff(B), or =diff(A+B).")
 
 
 ;;; Fine differences
 
 (ediff-defvar-local ediff-auto-refine (if (ediff-has-face-support-p) 'on 'nix)
   "If `on', Ediff auto-highlights fine diffs for the current diff region.
-If `off', auto-highlighting is not used. If `nix', no fine diffs are shown
+If `off', auto-highlighting is not used.  If `nix', no fine diffs are shown
 at all, unless the user force-refines the region by hitting `*'.
 
 This variable can be set either in .emacs or toggled interactively.
@@ -179,12 +179,12 @@ Lines that do not match are assumed to be error 
messages.")
   "Pattern to match lines produced by diff that describe differences.")
 
 (ediff-defvar-local ediff-setup-diff-regions-function nil
-  "value is a function symbol depending on the kind of job is to be done.
-For 2-way jobs and for ediff-merge, it should be `ediff-setup-diff-regions'.
+  "Value is a function symbol depending on the kind of job is to be done.
+For 2-way jobs and for `ediff-merge', it should be `ediff-setup-diff-regions'.
 For jobs requiring diff3, it should be `ediff-setup-diff-regions3'.
 
 The function should take three mandatory arguments, file-A, file-B, and
-file-C. It may ignore file C for diff2 jobs. It should also take
+file-C.  It may ignore file C for diff2 jobs.  It should also take
 one optional arguments, diff-number to refine.")
 
 
@@ -823,13 +823,10 @@ one optional arguments, diff-number to refine.")
       (setq overlay-list (cons overlay overlay-list))
       (if (> (length diff-list) 1)
          (setq diff-list (cdr (cdr diff-list)))
-       (error "ediff-set-fine-overlays-for-combined-merge: corrupt list of
-delimiter regions"))
-      )
+        (error "Corrupt list of delimiter regions")))
     (setq overlay-list (reverse overlay-list))
     (ediff-set-fine-diff-vector
-     reg-num 'C (apply #'vector overlay-list))
-    ))
+     reg-num 'C (apply #'vector overlay-list))))
 
 
 ;; Convert diff list to overlays for a given DIFF-REGION
@@ -1461,8 +1458,7 @@ affects only files whose names match the expression."
         (message "Ignoring letter case is not supported by this diff program"))
        (t
         (sit-for 1)
-        (ediff-update-diffs)))
-  )
+         (ediff-update-diffs))))
 
 (provide 'ediff-diff)
 ;;; ediff-diff.el ends here
diff --git a/lisp/vc/ediff-help.el b/lisp/vc/ediff-help.el
index 2f8f596ed1..0450cd7f23 100644
--- a/lisp/vc/ediff-help.el
+++ b/lisp/vc/ediff-help.el
@@ -126,9 +126,9 @@ Normally, not a user option.  See `ediff-help-message' for 
details.")
 (defconst ediff-brief-message-string
   " Type ? for help"
   "Contents of the brief help message.")
-;; The actual brief help message
 (ediff-defvar-local ediff-brief-help-message ""
-  "Normally, not a user option.  See `ediff-help-message' for details.")
+  "The actual brief help message.
+Normally, not a user option.  See `ediff-help-message' for details.")
 
 (ediff-defvar-local ediff-brief-help-message-function nil
   "The brief help message that the user can customize.
@@ -143,7 +143,6 @@ See `ediff-brief-help-message-function' for more.")
   :type 'boolean
   :group 'ediff-window)
 
-;; The actual help message.
 (ediff-defvar-local ediff-help-message ""
   "The actual help message.
 Normally, the user shouldn't touch this.  However, if you want Ediff to
diff --git a/lisp/vc/ediff-init.el b/lisp/vc/ediff-init.el
index 1d87b081f2..eaccb7a98c 100644
--- a/lisp/vc/ediff-init.el
+++ b/lisp/vc/ediff-init.el
@@ -74,46 +74,45 @@ that Ediff doesn't know about.")
        (boundp 'ediff-use-toolbar-p)
        ediff-use-toolbar-p))           ;Does the user want it ?
 
-;; Defines VAR as an advertised local variable.
-;; Performs a defvar, then executes `make-variable-buffer-local' on
-;; the variable.  Also sets the `permanent-local' property,
-;; so that `kill-all-local-variables' (called by major-mode setting
-;; commands) won't destroy Ediff control variables.
-;;
 ;; Plagiarized from `emerge-defvar-local'.
-(defmacro ediff-defvar-local (var value doc)
-  "Defines VAR as a local variable."
+(defmacro ediff-defvar-local (symbol value &optional doc)
+  "Define SYMBOL as an advertised buffer-local variable.
+Run `defvar-local', setting the value of the variable to VALUE
+and its docstring to DOC.
+
+Then set the `permanent-local' property, so that
+`kill-all-local-variables' (called by major-mode setting
+commands) won't destroy Ediff control variables."
   (declare (indent defun) (doc-string 3))
   `(progn
-     (defvar-local ,var ,value ,doc)
-     (put ',var 'permanent-local t)))
+     (defvar-local ,symbol ,value ,doc)
+     (put ',symbol 'permanent-local t)))
 
 
 
 ;; Variables that control each Ediff session---local to the control buffer.
 
 ;; Mode variables
-;; The buffer in which the A variant is stored.
-(ediff-defvar-local ediff-buffer-A nil "")
-;; The buffer in which the B variant is stored.
-(ediff-defvar-local ediff-buffer-B nil "")
-;; The buffer in which the C variant is stored or where the merge buffer lives.
-(ediff-defvar-local ediff-buffer-C nil "")
-;; Ancestor buffer
-(ediff-defvar-local ediff-ancestor-buffer nil "")
-;; The Ediff control buffer
-(ediff-defvar-local ediff-control-buffer nil "")
+(ediff-defvar-local ediff-buffer-A nil
+  "The buffer in which the A variant is stored.")
+(ediff-defvar-local ediff-buffer-B nil
+  "The buffer in which the B variant is stored.")
+(ediff-defvar-local ediff-buffer-C nil
+  "The buffer in which the C variant is stored or where the merge buffer 
lives.")
+(ediff-defvar-local ediff-ancestor-buffer nil
+  "Ancestor buffer.")
+(ediff-defvar-local ediff-control-buffer nil
+  "The Ediff control buffer.")
 
 (ediff-defvar-local ediff-temp-indirect-buffer nil
   "If t, the buffer is a temporary indirect buffer.
 It needs to be killed when we quit the session.")
 
-
-;; Association between buff-type and ediff-buffer-*
 (defconst ediff-buffer-alist
   '((?A . ediff-buffer-A)
     (?B . ediff-buffer-B)
-    (?C . ediff-buffer-C)))
+    (?C . ediff-buffer-C))
+  "Association between `buff-type' and `ediff-buffer-*'.")
 
 ;;; Macros
 (defsubst ediff-buffer-live-p (buf)
@@ -161,10 +160,10 @@ It needs to be killed when we quit the session.")
 ;; no-fine-diffs-flag says if there are fine differences.
 ;; state-of-difference is A, B, C, or nil, indicating which buffer is
 ;;     different from the other two (used only in 3-way jobs.
-(ediff-defvar-local ediff-difference-vector-A nil "")
-(ediff-defvar-local ediff-difference-vector-B nil "")
-(ediff-defvar-local ediff-difference-vector-C nil "")
-(ediff-defvar-local ediff-difference-vector-Ancestor nil "")
+(ediff-defvar-local ediff-difference-vector-A nil)
+(ediff-defvar-local ediff-difference-vector-B nil)
+(ediff-defvar-local ediff-difference-vector-C nil)
+(ediff-defvar-local ediff-difference-vector-Ancestor nil)
 ;; A-list of diff vector types associated with buffer types
 (defconst ediff-difference-vector-alist
   '((A . ediff-difference-vector-A)
@@ -270,7 +269,7 @@ It needs to be killed when we quit the session.")
   '(memq
     ediff-job-name
     '(ediff-files3 ediff-buffers3)))
-(ediff-defvar-local ediff-3way-comparison-job nil "")
+(ediff-defvar-local ediff-3way-comparison-job nil)
 
 (defmacro ediff-merge-job ()
   '(memq
@@ -281,7 +280,7 @@ It needs to be killed when we quit the session.")
       ediff-merge-buffers-with-ancestor
       ediff-merge-revisions
       ediff-merge-revisions-with-ancestor)))
-(ediff-defvar-local ediff-merge-job nil "")
+(ediff-defvar-local ediff-merge-job nil)
 
 (defmacro ediff-patch-job ()
   '(eq ediff-job-name 'epatch))
@@ -292,18 +291,18 @@ It needs to be killed when we quit the session.")
     '(ediff-merge-files-with-ancestor
       ediff-merge-buffers-with-ancestor
       ediff-merge-revisions-with-ancestor)))
-(ediff-defvar-local ediff-merge-with-ancestor-job nil "")
+(ediff-defvar-local ediff-merge-with-ancestor-job nil)
 
 (defmacro ediff-3way-job ()
   '(or ediff-3way-comparison-job ediff-merge-job))
-(ediff-defvar-local ediff-3way-job nil "")
+(ediff-defvar-local ediff-3way-job nil)
 
 ;; A diff3 job is like a 3way job, but ediff-merge doesn't require the use
 ;; of diff3.
 (defmacro ediff-diff3-job ()
   '(or ediff-3way-comparison-job
        ediff-merge-with-ancestor-job))
-(ediff-defvar-local ediff-diff3-job nil "")
+(ediff-defvar-local ediff-diff3-job nil)
 
 (defmacro ediff-windows-job ()
   '(memq ediff-job-name '(ediff-windows-wordwise ediff-windows-linewise)))
@@ -311,14 +310,14 @@ It needs to be killed when we quit the session.")
 
 (defmacro ediff-word-mode-job ()
   '(memq ediff-job-name '(ediff-windows-wordwise ediff-regions-wordwise)))
-(ediff-defvar-local ediff-word-mode-job nil "")
+(ediff-defvar-local ediff-word-mode-job nil)
 
 (defmacro ediff-narrow-job ()
   '(memq ediff-job-name '(ediff-windows-wordwise
                          ediff-regions-wordwise
                          ediff-windows-linewise
                          ediff-regions-linewise)))
-(ediff-defvar-local ediff-narrow-job nil "")
+(ediff-defvar-local ediff-narrow-job nil)
 
 ;; Note: ediff-merge-directory-revisions-with-ancestor is not treated as an
 ;; ancestor metajob, since it behaves differently.
@@ -491,11 +490,11 @@ set local variables that determine how the display looks 
like."
 (defconst ediff-BAD-DIFF-NUMBER
   ;; %S stands for this-command, %d - diff number, %d - max diff
   "%S: Bad diff region number, %d.  Valid numbers are 1 to %d")
-(defconst ediff-BAD-INFO (format "
+(defconst ediff-BAD-INFO "
 *** The Info file for Ediff, a part of the standard distribution
 *** of Emacs, does not seem to be properly installed.
 ***
-*** Please contact your system administrator. "))
+*** Please contact your system administrator. ")
 
 ;; Selective browsing
 
@@ -515,25 +514,25 @@ See the documentation string of 
`ediff-hide-regexp-matches' for details.")
   "Function to use in determining which regions to focus on.
 See the documentation string of `ediff-focus-on-regexp-matches' for details.")
 
-;; Regexp that determines buf A regions to focus on when skipping to diff
-(ediff-defvar-local ediff-regexp-focus-A "" "")
-;; Regexp that determines buf B regions to focus on when skipping to diff
-(ediff-defvar-local ediff-regexp-focus-B "" "")
-;; Regexp that determines buf C regions to focus on when skipping to diff
-(ediff-defvar-local ediff-regexp-focus-C "" "")
+(ediff-defvar-local ediff-regexp-focus-A ""
+  "Regexp that determines buf A regions to focus on when skipping to diff.")
+(ediff-defvar-local ediff-regexp-focus-B ""
+  "Regexp that determines buf B regions to focus on when skipping to diff.")
+(ediff-defvar-local ediff-regexp-focus-C ""
+  "Regexp that determines buf C regions to focus on when skipping to diff.")
 ;; connective that determines whether to focus regions that match both or
 ;; one of the regexps
-(ediff-defvar-local ediff-focus-regexp-connective 'and "")
-
-;; Regexp that determines buf A regions to ignore when skipping to diff
-(ediff-defvar-local ediff-regexp-hide-A "" "")
-;; Regexp that determines buf B regions to ignore when skipping to diff
-(ediff-defvar-local ediff-regexp-hide-B "" "")
-;; Regexp that determines buf C regions to ignore when skipping to diff
-(ediff-defvar-local ediff-regexp-hide-C "" "")
+(ediff-defvar-local ediff-focus-regexp-connective 'and)
+
+(ediff-defvar-local ediff-regexp-hide-A ""
+  "Regexp that determines buf A regions to ignore when skipping to diff.")
+(ediff-defvar-local ediff-regexp-hide-B ""
+  "Regexp that determines buf B regions to ignore when skipping to diff.")
+(ediff-defvar-local ediff-regexp-hide-C ""
+  "Regexp that determines buf C regions to ignore when skipping to diff.")
 ;; connective that determines whether to hide regions that match both or
 ;; one of the regexps
-(ediff-defvar-local ediff-hide-regexp-connective 'and "")
+(ediff-defvar-local ediff-hide-regexp-connective 'and)
 
 
 ;;; Copying difference regions between buffers.
@@ -543,12 +542,12 @@ See the documentation string of 
`ediff-focus-on-regexp-matches' for details.")
 ;; from another buffer.  This alist has the form:
 ;; \((num (buff-object . diff) (buff-object . diff) (buff-object . diff)) ...),
 ;; where some buffer-objects may be missing.
-(ediff-defvar-local ediff-killed-diffs-alist nil "")
+(ediff-defvar-local ediff-killed-diffs-alist nil)
 
 ;; Syntax table to use in ediff-forward-word-function
 ;; This is chosen by a heuristic. The important thing is for all buffers to
 ;; have the same syntax table. Which is not too important.
-(ediff-defvar-local ediff-syntax-table nil "")
+(ediff-defvar-local ediff-syntax-table nil)
 
 
 ;; Highlighting
@@ -588,25 +587,25 @@ highlighted using ASCII flags."
 
 ;; this indicates that diff regions are word-size, so fine diffs are
 ;; permanently nixed; used in ediff-windows-wordwise and ediff-regions-wordwise
-(ediff-defvar-local ediff-word-mode nil "")
+(ediff-defvar-local ediff-word-mode nil)
 ;; Name of the job (ediff-files, ediff-windows, etc.)
-(ediff-defvar-local ediff-job-name nil "")
+(ediff-defvar-local ediff-job-name nil)
 
 ;; Narrowing and ediff-region/windows support
 ;; This is a list (overlay-A overlay-B overlay-C)
 ;; If set, Ediff compares only those parts of buffers A/B/C that lie within
 ;; the bounds of these overlays.
-(ediff-defvar-local ediff-narrow-bounds nil "")
+(ediff-defvar-local ediff-narrow-bounds nil)
 
 ;; List (overlay-A overlay-B overlay-C), where each overlay spans the
 ;; entire corresponding buffer.
-(ediff-defvar-local ediff-wide-bounds nil "")
+(ediff-defvar-local ediff-wide-bounds nil)
 
 ;; Current visibility boundaries in buffers A, B, and C.
 ;; This is also a list of overlays.  When the user toggles narrow/widen,
 ;; this list changes from ediff-wide-bounds to ediff-narrow-bounds.
 ;; and back.
-(ediff-defvar-local ediff-visible-bounds nil "")
+(ediff-defvar-local ediff-visible-bounds nil)
 
 (ediff-defvar-local ediff-start-narrowed t
   "Non-nil means start narrowed, if doing ediff-windows-* or ediff-regions-*")
@@ -631,28 +630,28 @@ shown in brighter colors."
 (put 'ediff-highlight-all-diffs 'permanent-local t)
 
 
-;; The suffix of the control buffer name.
-(ediff-defvar-local ediff-control-buffer-suffix nil "")
-;; Same as ediff-control-buffer-suffix, but without <,>.
-;; It's a number rather than string.
-(ediff-defvar-local ediff-control-buffer-number nil "")
+(ediff-defvar-local ediff-control-buffer-suffix nil
+  "The suffix of the control buffer name.")
+(ediff-defvar-local ediff-control-buffer-number nil
+  "Same as `ediff-control-buffer-suffix', but without \"<,>\".
+It's a number rather than string.")
 
 
-;; The original values of ediff-protected-variables for buffer A
-(ediff-defvar-local ediff-buffer-values-orig-A nil "")
-;; The original values of ediff-protected-variables for buffer B
-(ediff-defvar-local ediff-buffer-values-orig-B nil "")
-;; The original values of ediff-protected-variables for buffer C
-(ediff-defvar-local ediff-buffer-values-orig-C nil "")
-;; The original values of ediff-protected-variables for buffer Ancestor
-(ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "")
+(ediff-defvar-local ediff-buffer-values-orig-A nil
+  "The original values of ediff-protected-variables for buffer A.")
+(ediff-defvar-local ediff-buffer-values-orig-B nil
+  "The original values of ediff-protected-variables for buffer B.")
+(ediff-defvar-local ediff-buffer-values-orig-C nil
+  "The original values of ediff-protected-variables for buffer C.")
+(ediff-defvar-local ediff-buffer-values-orig-Ancestor nil
+  "The original values of ediff-protected-variables for buffer Ancestor.")
 
-;; association between buff-type and ediff-buffer-values-orig-*
 (defconst ediff-buffer-values-orig-alist
   '((A . ediff-buffer-values-orig-A)
     (B . ediff-buffer-values-orig-B)
     (C . ediff-buffer-values-orig-C)
-    (Ancestor . ediff-buffer-values-orig-Ancestor)))
+    (Ancestor . ediff-buffer-values-orig-Ancestor))
+  "Association between buff-type and `ediff-buffer-values-orig-*'.")
 
 ;; Buffer-local variables to be saved then restored during Ediff sessions
 (defconst ediff-protected-variables '(
@@ -665,37 +664,37 @@ shown in brighter colors."
 ;; indicates the way a diff region was created in buffer C.
 ;; state-of-ancestor says if the corresponding region in ancestor buffer is
 ;; empty.
-(ediff-defvar-local ediff-state-of-merge nil "")
-
-;; The difference that is currently selected.
-(ediff-defvar-local ediff-current-difference -1 "")
-;; Number of differences found.
-(ediff-defvar-local ediff-number-of-differences nil "")
-
-;; Buffer containing the output of diff, which is used by Ediff to step
-;; through files.
-(ediff-defvar-local ediff-diff-buffer nil "")
-;; Like ediff-diff-buffer, but contains context diff.  It is not used by
-;; Ediff, but it is saved in a file, if user requests so.
-(ediff-defvar-local ediff-custom-diff-buffer nil "")
-;; Buffer used for diff-style fine differences between regions.
-(ediff-defvar-local ediff-fine-diff-buffer nil "")
+(ediff-defvar-local ediff-state-of-merge nil)
+
+(ediff-defvar-local ediff-current-difference -1
+  "The difference that is currently selected.")
+(ediff-defvar-local ediff-number-of-differences nil
+  "Number of differences found.")
+
+(ediff-defvar-local ediff-diff-buffer nil
+  "Buffer containing the output of diff, which is used to step through files.")
+(ediff-defvar-local ediff-custom-diff-buffer nil
+  "Like `ediff-diff-buffer', but contains context diff.
+It is not used by Ediff, but it is saved in a file, if user
+requests so.")
+(ediff-defvar-local ediff-fine-diff-buffer nil
+  "Buffer used for diff-style fine differences between regions.")
 (defconst ediff-tmp-buffer " *ediff-tmp*"
   "Temporary buffer used for computing fine differences.")
 (defconst ediff-msg-buffer " *ediff-message*"
   "Buffer used for messages.")
-;; Buffer containing the output of diff when diff returns errors.
-(ediff-defvar-local ediff-error-buffer nil "")
-;; Buffer to display debug info
-(ediff-defvar-local ediff-debug-buffer "*ediff-debug*" "")
+(ediff-defvar-local ediff-error-buffer nil
+  "Buffer containing the output of diff when diff returns errors.")
+(ediff-defvar-local ediff-debug-buffer "*ediff-debug*"
+  "Buffer to display debug info.")
 
-;; List of ediff control panels associated with each buffer A/B/C/Ancestor.
-;; Not used any more, but may be needed in the future.
-(ediff-defvar-local ediff-this-buffer-ediff-sessions  nil "")
+(ediff-defvar-local ediff-this-buffer-ediff-sessions nil
+  "List of ediff control panels associated with each buffer A/B/C/Ancestor.
+Not used any more, but may be needed in the future.")
 
 ;; to be deleted in due time
 ;; List of difference overlays disturbed by working with the current diff.
-(defvar ediff-disturbed-overlays nil "")
+(defvar ediff-disturbed-overlays nil)
 
 (defcustom ediff-version-control-package 'vc
   "Version control package used.
@@ -707,7 +706,7 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if 
you so desire."
   :group 'ediff)
 
 (defcustom ediff-coding-system-for-read 'raw-text
-  "The coding system for read to use when running the diff program as a 
subprocess.
+  "Coding system for read to use when running the diff program as a subprocess.
 In most cases, the default will do.  However, under certain circumstances in
 MS-Windows you might need to use something like `raw-text-dos' here.
 So, if the output that your diff program sends to Emacs contains extra ^M's,
@@ -717,8 +716,9 @@ work."
   :group 'ediff)
 
 (defcustom ediff-coding-system-for-write 'emacs-internal
-  "The coding system for write to use when writing out difference regions
-to temp files in buffer jobs and when Ediff needs to find fine differences."
+  "Coding system for write to use when writing out difference regions.
+This is used when writing to temp files in buffer jobs and when
+Ediff needs to find fine differences."
   :type 'symbol
   :group 'ediff)
 
@@ -738,8 +738,7 @@ to temp files in buffer jobs and when Ediff needs to find 
fine differences."
 ;; in effect for this buffer: `face', `ascii',
 ;; `off' -- turned off (on a dumb terminal only).
 (ediff-defvar-local ediff-highlighting-style
-  (if (and (ediff-has-face-support-p) ediff-use-faces) 'face 'ascii)
-  "")
+  (if (and (ediff-has-face-support-p) ediff-use-faces) 'face 'ascii))
 
 
 (define-obsolete-function-alias 'ediff-display-pixel-width
@@ -789,7 +788,7 @@ to temp files in buffer jobs and when Ediff needs to find 
fine differences."
 
 
 (defun ediff-set-face-pixmap (face pixmap)
-  "Set face pixmap on a monochrome display."
+  "Set stipple pixmap of FACE to PIXMAP on a monochrome display."
   (if (and (ediff-window-display-p) (not (display-color-p)))
       (condition-case nil
          (set-face-background-pixmap face pixmap)
@@ -1220,7 +1219,7 @@ This property can be toggled interactively."
 
 ;; Store orig value of `ediff-show-ancestor'  when changed in
 ;; `ediff-toggle-show-ancestor' and restore it on exit.
-(ediff-defvar-local ediff--show-ancestor-orig nil "")
+(ediff-defvar-local ediff--show-ancestor-orig nil)
 
 (defcustom ediff-autostore-merges  'group-jobs-only
   "Save the results of merge jobs automatically.
@@ -1232,8 +1231,8 @@ or `ediff-merge-directory-revisions'."
   :group 'ediff-merge)
 (make-variable-buffer-local 'ediff-autostore-merges)
 
-;; file where the result of the merge is to be saved.  used internally
-(ediff-defvar-local ediff-merge-store-file nil "")
+(ediff-defvar-local ediff-merge-store-file nil
+  "File where the result of the merge is to be saved.  Internal.")
 
 (defcustom ediff-merge-filename-prefix "merge_"
   "Prefix to be attached to saved merge buffers."
@@ -1266,12 +1265,12 @@ This default should work without changes."
 (make-obsolete-variable 'ediff-H-glyph nil "28.1")
 
 
-;; Temporary file used for refining difference regions in buffer A.
-(ediff-defvar-local ediff-temp-file-A nil "")
-;; Temporary file used for refining difference regions in buffer B.
-(ediff-defvar-local ediff-temp-file-B nil "")
-;; Temporary file used for refining difference regions in buffer C.
-(ediff-defvar-local ediff-temp-file-C nil "")
+(ediff-defvar-local ediff-temp-file-A nil
+  "Temporary file used for refining difference regions in buffer A.")
+(ediff-defvar-local ediff-temp-file-B nil
+  "Temporary file used for refining difference regions in buffer B.")
+(ediff-defvar-local ediff-temp-file-C nil
+  "Temporary file used for refining difference regions in buffer C.")
 
 
 (defun ediff-file-remote-p (file-name)
diff --git a/lisp/vc/ediff-mult.el b/lisp/vc/ediff-mult.el
index cfb58349eb..fa26b0b32f 100644
--- a/lisp/vc/ediff-mult.el
+++ b/lisp/vc/ediff-mult.el
@@ -114,8 +114,8 @@
 (require 'ediff-util)
 
 ;; meta-buffer
-(ediff-defvar-local ediff-meta-buffer nil "")
-(ediff-defvar-local ediff-parent-meta-buffer nil "")
+(ediff-defvar-local ediff-meta-buffer nil)
+(ediff-defvar-local ediff-parent-meta-buffer nil)
 ;; the registry buffer
 (defvar ediff-registry-buffer nil)
 
@@ -161,23 +161,23 @@ Useful commands (type ? to hide them and free up screen):
 
 ;; Variable specifying the action to take when the use invokes ediff in the
 ;; meta buffer.  This is usually ediff-registry-action or 
ediff-filegroup-action
-(ediff-defvar-local ediff-meta-action-function nil "")
+(ediff-defvar-local ediff-meta-action-function nil)
 ;; Tells ediff-update-meta-buffer how to redraw it
-(ediff-defvar-local ediff-meta-redraw-function nil "")
+(ediff-defvar-local ediff-meta-redraw-function nil)
 ;; Tells ediff-filegroup-action and similar procedures how to invoke Ediff for
 ;; the sessions in a given session group
-(ediff-defvar-local ediff-session-action-function nil "")
+(ediff-defvar-local ediff-session-action-function nil)
 
-(ediff-defvar-local ediff-metajob-name nil "")
+(ediff-defvar-local ediff-metajob-name nil)
 
 ;; buffer used to collect custom diffs from individual sessions in the group
-(ediff-defvar-local ediff-meta-diff-buffer nil "")
+(ediff-defvar-local ediff-meta-diff-buffer nil)
 
 ;; t means recurse into subdirs when deciding which files have same contents
-(ediff-defvar-local ediff-recurse-to-subdirectories nil "")
+(ediff-defvar-local ediff-recurse-to-subdirectories nil)
 
 ;; history var to use for filtering groups of files
-(defvar ediff-filtering-regexp-history nil "")
+(defvar ediff-filtering-regexp-history nil)
 
 (defcustom ediff-default-filtering-regexp nil
   "Default regular expression used as a filename filter in multifile 
comparisons.
@@ -194,14 +194,14 @@ Should be a sexp.  For instance (car 
ediff-filtering-regexp-history) or nil."
 ;; buffer, this means ediff is still working on the pair.
 ;; Eq-status of a file is t if the file equals some other file in the same
 ;; group.
-(ediff-defvar-local ediff-meta-list nil "")
+(ediff-defvar-local ediff-meta-list nil)
 
-(ediff-defvar-local ediff-meta-session-number nil "")
+(ediff-defvar-local ediff-meta-session-number nil)
 
 
 ;; the difference list between directories in a directory session group
-(ediff-defvar-local ediff-dir-difference-list nil "")
-(ediff-defvar-local ediff-dir-diffs-buffer nil "")
+(ediff-defvar-local ediff-dir-difference-list nil)
+(ediff-defvar-local ediff-dir-diffs-buffer nil)
 
 ;; The registry of Ediff sessions.  A list of control buffers.
 (defvar ediff-session-registry nil)
@@ -232,8 +232,8 @@ on `ediff-quit', `ediff-suspend', or 
`ediff-quit-session-group-hook'."
 (make-obsolete-variable 'ediff-before-session-group-setup-hooks nil "27.1")
 
 (defcustom ediff-after-session-group-setup-hook nil
-  "Hooks run just after a meta-buffer controlling a session group, such as
-ediff-directories, is run."
+  "Hooks run just after a meta-buffer controlling a session group is run.
+One example of this is `ediff-directories'."
   :type 'hook)
 (defcustom ediff-quit-session-group-hook nil
   "Hooks run just before exiting a session group."
@@ -251,8 +251,8 @@ This means that you can set different bindings for 
different kinds of meta
 buffers."
   :type 'hook)
 
-;; Buffer holding the multi-file patch.  Local to the meta buffer
-(ediff-defvar-local ediff-meta-patchbufer nil "")
+(ediff-defvar-local ediff-meta-patchbufer nil
+  "Buffer holding the multi-file patch.  Local to the meta buffer.")
 
 ;;; API for ediff-meta-list
 
@@ -366,8 +366,8 @@ buffers."
 
 
 (ediff-defvar-local ediff-verbose-help-enabled nil
-  "If t, display redundant help in ediff-directories and other meta buffers.
-Toggled by ediff-toggle-verbose-help-meta-buffer" )
+  "If t, display redundant help in `ediff-directories' and other meta buffers.
+Toggled by `ediff-toggle-verbose-help-meta-buffer'.")
 
 ;; Toggle verbose help in meta-buffers
 ;; TODO: Someone who understands all this can make it better.
@@ -459,7 +459,9 @@ Commands:
 
 (defun ediff-next-meta-item (count)
   "Move to the next item in Ediff registry or session group buffer.
-Moves in circular fashion.  With numeric prefix arg, skip this many items."
+Moves in circular fashion.
+
+With numeric prefix arg COUNT, skip this many items."
   (interactive "p")
   (or count (setq count 1))
   (let (overl)
@@ -487,7 +489,9 @@ Moves in circular fashion.  With numeric prefix arg, skip 
this many items."
 
 (defun ediff-previous-meta-item (count)
   "Move to the previous item in Ediff registry or session group buffer.
-Moves in circular fashion.  With numeric prefix arg, skip this many items."
+Moves in circular fashion.
+
+With numeric prefix arg COUNT, skip this many items."
   (interactive "p")
   (or count (setq count 1))
   (let (overl)
@@ -1530,7 +1534,9 @@ Useful commands:
        (ediff-overlay-put overl 'ediff-meta-session-number session-number))))
 
 (defun ediff-mark-for-hiding-at-pos (unmark)
-  "Mark session for hiding.  With prefix arg, unmark."
+  "Mark session for hiding.
+
+With prefix arg UNMARK, unmark instead."
   (interactive "P")
   (let* ((pos (ediff-event-point last-command-event))
         (meta-buf (ediff-event-buffer last-command-event))
@@ -1540,10 +1546,9 @@ Useful commands:
     (ediff-mark-session-for-hiding info unmark)
     (ediff-next-meta-item 1)
     (save-excursion
-      (ediff-update-meta-buffer meta-buf nil session-number))
-    ))
+      (ediff-update-meta-buffer meta-buf nil session-number))))
 
-;; Returns whether session was marked or unmarked
+;; Return whether session was marked or unmarked.
 (defun ediff-mark-session-for-hiding (info unmark)
   (let (ignore)
     (cond ((eq unmark 'mark) (setq unmark nil))
@@ -1559,7 +1564,9 @@ Useful commands:
 
 
 (defun ediff-mark-for-operation-at-pos (unmark)
-  "Mark session for a group operation.  With prefix arg, unmark."
+  "Mark session for a group operation.
+
+With prefix arg UNMARK, unmark instead."
   (interactive "P")
   (let* ((pos (ediff-event-point last-command-event))
         (meta-buf (ediff-event-buffer last-command-event))
@@ -1588,7 +1595,9 @@ Useful commands:
 
 
 (defun ediff-hide-marked-sessions (unhide)
-  "Hide marked sessions.  With prefix arg, unhide."
+  "Hide marked sessions.
+
+With prefix arg UNHIDE, unhide instead."
   (interactive "P")
   (let ((grp-buf (ediff-get-group-buffer ediff-meta-list))
        (meta-list (cdr ediff-meta-list))
diff --git a/lisp/vc/ediff-ptch.el b/lisp/vc/ediff-ptch.el
index d52910efce..4135e8b470 100644
--- a/lisp/vc/ediff-ptch.el
+++ b/lisp/vc/ediff-ptch.el
@@ -128,18 +128,19 @@ You probably don't want to change that, unless you are 
using an obscure patch
 program."
   :type 'regexp)
 
-;; The buffer of the patch file.  Local to control buffer.
-(ediff-defvar-local ediff-patchbufer nil "")
-
-;; The buffer where patch displays its diagnostics.
-(ediff-defvar-local ediff-patch-diagnostics nil "")
-
-;; Map of patch buffer.  Has the form:
-;;    ((filename1 marker1 marker2) (filename2 marker1 marker2) ...)
-;; where filenames are files to which patch would have applied the patch;
-;; marker1 delimits the beginning of the corresponding patch and marker2 does
-;; it for the end.
-(ediff-defvar-local ediff-patch-map nil "")
+(ediff-defvar-local ediff-patchbufer nil
+  "The buffer of the patch file.  Local to control buffer.")
+
+(ediff-defvar-local ediff-patch-diagnostics nil
+  "The buffer where patch displays its diagnostics.")
+
+(ediff-defvar-local ediff-patch-map nil
+  "Map of patch buffer.
+Has the form:
+   ((filename1 marker1 marker2) (filename2 marker1 marker2) ...)
+where filenames are files to which patch would have applied the patch;
+marker1 delimits the beginning of the corresponding patch and marker2 does
+it for the end.")
 
 ;; strip prefix from filename
 ;; returns /dev/null, if can't strip prefix
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index 74c6aba1e4..5646fd3d42 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -513,7 +513,7 @@ to invocation.")
 ;; This function assumes that we are in the window where control buffer is
 ;; to reside.
 (defun ediff-setup-control-buffer (ctl-buf)
-  "Set up window for control buffer."
+  "Set up window for control buffer CTL-BUF."
   (if (window-dedicated-p)
       (set-buffer ctl-buf) ; we are in control frame but just in case
     (switch-to-buffer ctl-buf))
@@ -661,7 +661,7 @@ if necessary."
     (message "")
     ))
 
-;; Not bound to any key---to dangerous.  A user can do it if necessary.
+;; Not bound to any key---too dangerous.  A user can do it if necessary.
 (defun ediff-revert-buffers-then-recompute-diffs (noconfirm)
   "Revert buffers A, B and C.  Then rerun Ediff on file A and file B."
   (interactive "P")
@@ -696,11 +696,12 @@ if necessary."
            (ediff-merge-buffers bufA bufB)))
       (ediff-update-diffs))))
 
-
-;; optional NO-REHIGHLIGHT says to not rehighlight buffers
 (defun ediff-recenter (&optional no-rehighlight)
   "Bring the highlighted region of all buffers being compared into view.
-Reestablish the default window display."
+Reestablish the default window display.
+
+If optional NO-REHIGHLIGHT is non-nil, do not rehighlight
+buffers."
   (interactive)
   (ediff-barf-if-not-control-buffer)
   (let (buffer-read-only)
@@ -965,7 +966,7 @@ Please report this bug to bug-gnu-emacs@gnu.org")
     (message "Showing ancestor buffer")))
 
 (defun ediff-make-or-kill-fine-diffs (arg)
-  "Compute fine diffs.  With negative prefix arg, kill fine diffs.
+  "Compute fine diffs.  With negative prefix ARG, kill fine diffs.
 In both cases, operates on the current difference region."
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
@@ -1329,7 +1330,7 @@ To change the default, set the variable 
`ediff-use-toolbar-p', which see."
 ;; Merging
 
 (defun ediff-toggle-show-clashes-only ()
-  "Toggle the mode that shows only the merge regions where both variants 
differ from the ancestor."
+  "Toggle mode showing only merge regions where both variants differ from 
ancestor."
   (interactive)
   (ediff-barf-if-not-control-buffer)
   (if (not ediff-merge-with-ancestor-job)
@@ -1510,7 +1511,7 @@ the one half of the height of window-A."
 
 (defun ediff-scroll-horizontally (&optional arg)
   "Horizontally scroll buffers A, B (and C if appropriate).
-If an argument is given, that is how many columns are scrolled, else nearly
+With prefix argument ARG, scroll that many columns, else nearly
 the width of the A/B/C windows."
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
@@ -1678,7 +1679,7 @@ the width of the A/B/C windows."
 
 (defun ediff-next-difference (&optional arg)
   "Advance to the next difference.
-With a prefix argument, go forward that many differences."
+With a prefix argument ARG, go forward that many differences."
   (interactive "p")
   (ediff-barf-if-not-control-buffer)
   (if (< ediff-current-difference ediff-number-of-differences)
@@ -1729,7 +1730,7 @@ With a prefix argument, go forward that many differences."
 
 (defun ediff-previous-difference (&optional arg)
   "Go to the previous difference.
-With a prefix argument, go back that many differences."
+With a prefix argument ARG, go back that many differences."
   (interactive "p")
   (ediff-barf-if-not-control-buffer)
   (if (> ediff-current-difference -1)
@@ -1779,8 +1780,9 @@ With a prefix argument, go back that many differences."
 ;; The diff number is as perceived by the user (i.e., 1+ the internal
 ;; representation)
 (defun ediff-jump-to-difference (difference-number)
-  "Go to the difference specified as a prefix argument.
-If the prefix is negative, count differences from the end."
+  "Go to the difference specified as a prefix argument DIFFERENCE-NUMBER.
+If the prefix argument is negative, count differences from the
+end."
   (interactive "p")
   (ediff-barf-if-not-control-buffer)
   (setq difference-number
@@ -1801,8 +1803,9 @@ If the prefix is negative, count differences from the 
end."
 The buffer depends on last command character \(a, b, or c) that invoked this
 command.  For instance, if the command was `ga' then the point value in buffer
 A is used.
-With a prefix argument, synchronize all files around the current point position
-in the specified buffer."
+
+With a prefix argument ARG, synchronize all files around the
+current point position in the specified buffer."
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
   (let* ((buf-type (ediff-char-to-buftype last-command-event))
@@ -1898,15 +1901,17 @@ in the specified buffer."
 
 (defun ediff-diff-to-diff (arg &optional keys)
   "Copy buffer-X'th difference region to buffer Y (X,Y are A, B, or C).
-If numerical prefix argument, copy the difference specified in the arg.
+With numerical prefix argument ARG, copy the difference specified
+in the arg.
 Otherwise, copy the difference given by `ediff-current-difference'.
 This command assumes it is bound to a 2-character key sequence, `ab', `ba',
 `ac', etc., which is used to determine the types of buffers to be used for
 copying difference regions.  The first character in the sequence specifies
 the source buffer and the second specifies the target.
 
-If the second optional argument, a 2-character string, is given, use it to
-determine the source and the target buffers instead of the command keys."
+If optional argument KEYS, a 2-character string, is given, use it
+to determine the source and the target buffers instead of the
+command keys."
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
   (or keys (setq keys (this-command-keys)))
@@ -2137,8 +2142,9 @@ ARG is a prefix argument.  If nil, copy the current 
difference region."
 (defun ediff-restore-diff  (arg &optional key)
   "Restore ARGth diff from `ediff-killed-diffs-alist'.
 ARG is a prefix argument.  If ARG is nil, restore the current-difference.
-If the second optional argument, a character, is given, use it to
-determine the target buffer instead of `ediff-last-command-char'."
+If the second optional argument KEY, a character, is given, use
+it to determine the target buffer instead of
+`ediff-last-command-char'."
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
   (if (numberp arg)
@@ -2157,8 +2163,8 @@ ARG is a prefix argument.  If nil, restore the current 
diff."
 
 
 (defun ediff-toggle-regexp-match ()
-  "Toggle between focusing and hiding of difference regions that match
-a regular expression typed in by the user."
+  "Toggle between focusing and hiding difference regions matching a regexp.
+Prompt the user for regular expression."
   (interactive)
   (ediff-barf-if-not-control-buffer)
   (let ((regexp-A "")
@@ -2358,9 +2364,11 @@ flags of the compared file buffers, kills Ediff buffers 
for this session
 \(but not buffers A, B, C).
 
 If `ediff-keep-variants' is nil, the user will be asked whether the buffers
-containing the variants should be removed \(if they haven't been modified).
-If it is t, they will be preserved unconditionally.  A prefix argument,
-temporarily reverses the meaning of this variable."
+containing the variants should be removed (if they haven't been modified).
+If it is t, they will be preserved unconditionally.
+
+With prefix argument REVERSE-DEFAULT-KEEP-VARIANTS, temporarily
+reverse the meaning of this variable."
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
   (let ((ctl-buf (current-buffer))
@@ -3269,7 +3277,7 @@ Hit \\[ediff-recenter] to reset the windows afterward."
 `wa' saves buffer A, `wb' saves buffer B, `wc' saves buffer C,
 and `wd' saves the diff output.
 
-With prefix argument, `wd' saves plain diff output.
+With prefix argument ARG, `wd' saves plain diff output.
 Without an argument, it saves customized diff argument, if available
 \(and plain output, if customized output was not generated)."
   (interactive "P")
@@ -4066,7 +4074,7 @@ Mail anyway? (y or n) ")
 
 ;;; Debug
 
-(ediff-defvar-local ediff-command-begin-time '(0 0 0) "")
+(ediff-defvar-local ediff-command-begin-time '(0 0 0))
 
 ;; calculate time used by command
 (defun ediff-calc-command-time ()
diff --git a/lisp/vc/ediff-wind.el b/lisp/vc/ediff-wind.el
index 7c90348b5d..bc6aa28850 100644
--- a/lisp/vc/ediff-wind.el
+++ b/lisp/vc/ediff-wind.el
@@ -89,25 +89,25 @@ provided functions are written."
                 (function :tag "Other function"))
   :version "24.3")
 
-;; indicates if we are in a multiframe setup
-(ediff-defvar-local ediff-multiframe nil "")
-
-;; Share of the frame occupied by the merge window (buffer C)
-(ediff-defvar-local ediff-merge-window-share 0.45 "")
-
-;; The control window.
-(ediff-defvar-local ediff-control-window nil "")
-;; Official window for buffer A
-(ediff-defvar-local ediff-window-A nil "")
-;; Official window for buffer B
-(ediff-defvar-local ediff-window-B nil "")
-;; Official window for buffer C
-(ediff-defvar-local ediff-window-C nil "")
-;; Official window for buffer Ancestor
-(ediff-defvar-local ediff-window-Ancestor nil "")
-;; Ediff's window configuration.
-;; Used to minimize the need to rearrange windows.
-(ediff-defvar-local ediff-window-config-saved "" "")
+(ediff-defvar-local ediff-multiframe nil
+  "Indicates if we are in a multiframe setup.")
+
+(ediff-defvar-local ediff-merge-window-share 0.45
+  "Share of the frame occupied by the merge window (buffer C).")
+
+(ediff-defvar-local ediff-control-window nil
+  "The control window.")
+(ediff-defvar-local ediff-window-A nil
+  "Official window for buffer A.")
+(ediff-defvar-local ediff-window-B nil
+  "Official window for buffer B.")
+(ediff-defvar-local ediff-window-C nil
+  "Official window for buffer C.")
+(ediff-defvar-local ediff-window-Ancestor nil
+  "Official window for buffer Ancestor.")
+(ediff-defvar-local ediff-window-config-saved ""
+  "Ediff's window configuration.
+Used to minimize the need to rearrange windows.")
 
 ;; Association between buff-type and ediff-window-*
 (defconst ediff-window-alist
@@ -176,9 +176,9 @@ In this case, Ediff will use those frames to display these 
buffers."
   "Frame parameters for displaying Ediff Control Panel.
 Used internally---not a user option.")
 
-;; position of the mouse; used to decide whether to warp the mouse into ctl
-;; frame
-(ediff-defvar-local ediff-mouse-pixel-position nil "")
+(ediff-defvar-local ediff-mouse-pixel-position nil
+  "Position of the mouse.
+Used to decide whether to warp the mouse into control frame.")
 
 ;; not used for now
 (defvar ediff-mouse-pixel-threshold 30
@@ -227,12 +227,10 @@ customization of the default."
 
 ;; Wide frame display
 
-;; t means Ediff is using wide display
-(ediff-defvar-local ediff-wide-display-p nil "")
-;; keeps frame config for toggling wide display
+(ediff-defvar-local ediff-wide-display-p nil
+  "If t, Ediff is using wide display.")
 (ediff-defvar-local ediff-wide-display-orig-parameters nil
-  "Frame parameters to be restored when the user wants to toggle the wide
-display off.")
+  "Frame parameters to restore when toggling the wide display off.")
 (ediff-defvar-local ediff-wide-display-frame nil
   "Frame to be used for wide display.")
 (ediff-defvar-local ediff-make-wide-display-function #'ediff-make-wide-display
@@ -243,8 +241,8 @@ frame parameters in `ediff-wide-display-orig-parameters'.
 The variable `ediff-wide-display-frame' should be set to contain
 the frame used for the wide display.")
 
-;; Frame used for the control panel in a windowing system.
-(ediff-defvar-local ediff-control-frame nil "")
+(ediff-defvar-local ediff-control-frame nil
+  "Frame used for the control panel in a windowing system.")
 
 (defcustom ediff-prefer-iconified-control-frame nil
   "If t, keep control panel iconified when help message is off.
@@ -844,7 +842,7 @@ keyboard input to go into icons."
 
 (defun ediff-skip-unsuitable-frames (&optional ok-unsplittable)
   "Skip unsplittable frames and frames that have dedicated windows.
-create a new splittable frame if none is found."
+Create a new splittable frame if none is found."
   (if (ediff-window-display-p)
       (let ((wind-frame (window-frame))
             seen-windows)
diff --git a/lisp/vc/ediff.el b/lisp/vc/ediff.el
index e884ed8c51..74ed1bd0ef 100644
--- a/lisp/vc/ediff.el
+++ b/lisp/vc/ediff.el
@@ -551,9 +551,11 @@ symbol describing the Ediff job type; it defaults to
 
 ;;;###autoload
 (defun ediff-directories (dir1 dir2 regexp)
-  "Run Ediff on a pair of directories, DIR1 and DIR2, comparing files that have
-the same name in both.  The third argument, REGEXP, is nil or a regular
-expression; only file names that match the regexp are considered."
+  "Run Ediff on directories DIR1 and DIR2, comparing files.
+Consider only files that have the same name in both directories.
+
+REGEXP is nil or a regular expression; only file names that match
+the regexp are considered."
   (interactive
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp t))
@@ -608,10 +610,11 @@ names.  Only the files that are under revision control 
are taken into account."
 
 ;;;###autoload
 (defun ediff-directories3 (dir1 dir2 dir3 regexp)
-  "Run Ediff on three directories, DIR1, DIR2, and DIR3, comparing files that
-have the same name in all three.  The last argument, REGEXP, is nil or a
-regular expression; only file names that match the regexp are considered."
+  "Run Ediff on directories DIR1, DIR2, and DIR3, comparing files.
+Consider only files that have the same name in all three directories.
 
+REGEXP is nil or a regular expression; only file names that match
+the regexp are considered."
   (interactive
    (let ((dir-A (ediff-get-default-directory-name))
         (default-regexp (eval ediff-default-filtering-regexp t))
diff --git a/lisp/vc/emerge.el b/lisp/vc/emerge.el
index b363fa256b..b2fdb07d5f 100644
--- a/lisp/vc/emerge.el
+++ b/lisp/vc/emerge.el
@@ -26,15 +26,18 @@
 
 ;;; Macros
 
-(defmacro emerge-defvar-local (var value doc)
+(defmacro emerge-defvar-local (symbol value &optional doc)
   "Define SYMBOL as an advertised buffer-local variable.
-Performs a defvar, then executes `make-variable-buffer-local' on
-the variable.  Also sets the `permanent-local' property, so that
-`kill-all-local-variables' (called by major-mode setting commands)
-won't destroy Emerge control variables."
+Run `defvar-local', setting the value of the variable to VALUE
+and its docstring to DOC.
+
+Then set the `permanent-local' property, so that
+`kill-all-local-variables' (called by major-mode setting
+commands) won't destroy Emerge control variables."
+  (declare (indent defun) (doc-string 3))
   `(progn
-     (defvar-local ,var ,value ,doc)
-     (put ',var 'permanent-local t)))
+     (defvar-local ,symbol ,value ,doc)
+     (put ',symbol 'permanent-local t)))
 
 ;; We need to define this function so describe-mode can describe Emerge mode.
 (define-minor-mode emerge-mode
@@ -217,8 +220,7 @@ depend on the flags."
 (emerge-new-flags)
 
 (defcustom emerge-min-visible-lines 3
-  "Number of lines that we want to show above and below the flags when we are
-displaying a difference."
+  "Number of lines to show above and below the flags when displaying a 
difference."
   :type 'integer)
 
 (defcustom emerge-temp-file-prefix
@@ -434,8 +436,7 @@ or nil if there is none.")
   '((buffer-modified-p set-buffer-modified-p)
     buffer-read-only
     buffer-auto-save-file-name)
-  "Variables and properties of a buffer which are saved, modified and restored
-during a merge.")
+  "Variables and properties of a buffer to save, modify and restore during a 
merge.")
 (defconst emerge-merging-values '(nil t nil)
   "Values to be assigned to emerge-saved-variables during a merge.")
 
@@ -481,10 +482,10 @@ replaced by emerge-fast-keymap.")
 (emerge-defvar-local emerge-old-keymap nil
   "The original local keymap for the merge buffer.")
 (emerge-defvar-local emerge-auto-advance nil
-                    "If non-nil, emerge-select-A and emerge-select-B 
automatically advance to
+  "If non-nil, emerge-select-A and emerge-select-B automatically advance to
 the next difference.")
 (emerge-defvar-local emerge-skip-prefers nil
-                    "If non-nil, differences for which there is a preference 
are automatically
+  "If non-nil, differences for which there is a preference are automatically
 skipped.")
 (emerge-defvar-local emerge-quit-hook nil
   "Hooks to run in the merge buffer after the merge has been finished.
@@ -825,7 +826,7 @@ This is *not* a user option, since Emerge uses it for its 
own processing.")
 ;;;###autoload
 (defun emerge-files (_arg file-A file-B file-out &optional startup-hooks
                     quit-hooks)
-  "Run Emerge on two files."
+  "Run Emerge on two files FILE-A and FILE-B."
   (interactive
    (let (f)
      (list current-prefix-arg
@@ -874,7 +875,7 @@ This is *not* a user option, since Emerge uses it for its 
own processing.")
 
 ;;;###autoload
 (defun emerge-buffers (buffer-A buffer-B &optional startup-hooks quit-hooks)
-  "Run Emerge on two buffers."
+  "Run Emerge on two buffers BUFFER-A and BUFFER-B."
   (interactive "bBuffer A to merge: \nbBuffer B to merge: ")
   (let ((emerge-file-A (emerge-make-temp-file "A"))
        (emerge-file-B (emerge-make-temp-file "B")))
@@ -1773,15 +1774,15 @@ BEG must be at the beginning of a line."
          (emerge-unselect-and-select-difference n)))
     (error "At beginning")))
 
-(defun emerge-jump-to-difference (difference-number)
-  "Go to the N-th difference."
+(defun emerge-jump-to-difference (n)
+  "Go to difference number N."
   (interactive "p")
   (let ((inhibit-read-only t))
-    (setq difference-number (1- difference-number))
-    (if (and (>= difference-number -1)
-            (< difference-number (1+ emerge-number-of-differences)))
-       (emerge-unselect-and-select-difference difference-number)
-      (error "Bad difference number"))))
+    (setq n (1- n))
+    (if (and (>= n -1)
+             (< n (1+ emerge-number-of-differences)))
+        (emerge-unselect-and-select-difference n)
+      (error "Bad difference number: %s" n))))
 
 (defun emerge-abort ()
   "Abort the Emerge session."
@@ -1790,7 +1791,7 @@ BEG must be at the beginning of a line."
 
 (defun emerge-quit (arg)
   "Finish the Emerge session and exit Emerge.
-Prefix argument means to abort rather than successfully finish.
+Prefix argument ARG means to abort rather than successfully finish.
 The difference depends on how the merge was started,
 but usually means to not write over one of the original files, or to signal
 to some process which invoked Emerge a failure code.
@@ -1849,7 +1850,7 @@ buffer after this will cause serious problems."
   "Select the A variant of this difference.
 Refuses to function if this difference has been edited, i.e., if it
 is neither the A nor the B variant.
-A prefix argument forces the variant to be selected
+With prefix argument FORCE, force the variant to be selected
 even if the difference has been edited."
   (interactive "P")
   (let ((operate #'emerge-select-A-edit)
@@ -1876,7 +1877,7 @@ even if the difference has been edited."
   "Select the B variant of this difference.
 Refuses to function if this difference has been edited, i.e., if it
 is neither the A nor the B variant.
-A prefix argument forces the variant to be selected
+With prefix argument FORCE, force the variant to be selected
 even if the difference has been edited."
   (interactive "P")
   (let ((operate #'emerge-select-B-edit)
@@ -1973,8 +1974,8 @@ must be prefixed with 
\\<emerge-fast-keymap>\\[emerge-basic-keymap]."
   "Toggle Auto-Advance mode, for Emerge.
 This mode causes `emerge-select-A' and `emerge-select-B' to automatically
 advance to the next difference.
-With a positive argument, turn on Auto-Advance mode.
-With a negative argument, turn off Auto-Advance mode."
+With a positive argument ARG, turn on Auto-Advance mode.
+With a negative argument ARG, turn off Auto-Advance mode."
   (interactive "P")
   (setq emerge-auto-advance (if (null arg)
                                (not emerge-auto-advance)
@@ -1988,8 +1989,8 @@ With a negative argument, turn off Auto-Advance mode."
   "Toggle Skip-Prefers mode, for Emerge.
 This mode causes `emerge-next-difference' and `emerge-previous-difference'
 to automatically skip over differences for which there is a preference.
-With a positive argument, turn on Skip-Prefers mode.
-With a negative argument, turn off Skip-Prefers mode."
+With a positive argument ARG, turn on Skip-Prefers mode.
+With a negative argument ARG, turn off Skip-Prefers mode."
   (interactive "P")
   (setq emerge-skip-prefers (if (null arg)
                                (not emerge-skip-prefers)
@@ -2028,7 +2029,7 @@ With a negative argument, turn off Skip-Prefers mode."
 (defun emerge-insert-A (arg)
   "Insert the A variant of this difference at the point.
 Leaves point after text, mark before.
-With prefix argument, puts point before, mark after."
+With prefix argument ARG, puts point before, mark after."
   (interactive "P")
   (emerge-validate-difference)
   (let* ((diff-vector
@@ -2046,7 +2047,7 @@ With prefix argument, puts point before, mark after."
 (defun emerge-insert-B (arg)
   "Insert the B variant of this difference at the point.
 Leaves point after text, mark before.
-With prefix argument, puts point before, mark after."
+With prefix argument ARG, puts point before, mark after."
   (interactive "P")
   (emerge-validate-difference)
   (let* ((diff-vector
@@ -2063,7 +2064,7 @@ With prefix argument, puts point before, mark after."
 
 (defun emerge-mark-difference (arg)
   "Leave the point before this difference and the mark after it.
-With prefix argument, puts mark before, point after."
+With prefix argument ARG, put mark before, point after."
   (interactive "P")
   (emerge-validate-difference)
   (let* ((diff-vector
@@ -2079,7 +2080,7 @@ With prefix argument, puts mark before, point after."
 
 (defun emerge-file-names ()
   "Show the names of the buffers or files being operated on by Emerge.
-Use C-u l to reset the windows afterward."
+Use \\[universal-argument] l to reset the windows afterward."
   (interactive)
   (delete-other-windows)
   (let ((temp-buffer-show-function
@@ -2122,7 +2123,7 @@ Use C-u l to reset the windows afterward."
 
 (defun emerge-join-differences (arg)
   "Join the selected difference with the following one.
-With a prefix argument, join with the preceding one."
+With a prefix argument ARG, join with the preceding one."
   (interactive "P")
   (let ((n emerge-current-difference))
     ;; adjust n to be first difference to join
@@ -2332,9 +2333,9 @@ ancestor version does not share.)"
 ;; to have it ask for a buffer.
 (defun emerge-find-difference (arg)
   "Find the difference containing the current position of the point.
-If there is no containing difference and the prefix argument is positive,
-it finds the nearest following difference.  A negative prefix argument finds
-the nearest previous difference."
+If there is no containing difference and the prefix argument ARG
+is positive, find the nearest following difference.  With
+negative prefix argument, find the nearest previous difference."
   (interactive "P")
   (cond ((eq (current-buffer) emerge-A-buffer)
         (emerge-find-difference-A arg))
@@ -2344,9 +2345,9 @@ the nearest previous difference."
 
 (defun emerge-find-difference-merge (arg)
   "Find the difference containing point, in the merge buffer.
-If there is no containing difference and the prefix argument is positive,
-it finds the nearest following difference.  A negative prefix argument finds
-the nearest previous difference."
+If there is no containing difference and the prefix argument ARG
+is positive, find the nearest following difference.  With
+negative prefix argument, find the nearest previous difference."
   (interactive "P")
   ;; search for the point in the merge buffer, using the markers
   ;; for the beginning and end of the differences in the merge buffer
@@ -2355,9 +2356,9 @@ the nearest previous difference."
 (defun emerge-find-difference-A (arg)
   "Find the difference containing point, in the A buffer.
 This command must be executed in the merge buffer.
-If there is no containing difference and the prefix argument is positive,
-it finds the nearest following difference.  A negative prefix argument finds
-the nearest previous difference."
+If there is no containing difference and the prefix argument ARG
+is positive, find the nearest following difference.  With
+negative prefix argument, find the nearest previous difference."
   (interactive "P")
   ;; search for the point in the A buffer, using the markers
   ;; for the beginning and end of the differences in the A buffer
@@ -2368,9 +2369,9 @@ the nearest previous difference."
 (defun emerge-find-difference-B (arg)
   "Find the difference containing point, in the B buffer.
 This command must be executed in the merge buffer.
-If there is no containing difference and the prefix argument is positive,
-it finds the nearest following difference.  A negative prefix argument finds
-the nearest previous difference."
+If there is no containing difference and the prefix argument ARG
+is positive, find the nearest following difference.  With
+negative prefix argument, find the nearest previous difference."
   (interactive "P")
   ;; search for the point in the B buffer, using the markers
   ;; for the beginning and end of the differences in the B buffer
@@ -2450,8 +2451,10 @@ merge buffers."
 (defun emerge-set-combine-template (string &optional localize)
   "Set `emerge-combine-versions-template' to STRING.
 This value controls how `emerge-combine-versions' combines the two versions.
-With prefix argument, `emerge-combine-versions-template' is made local to this
-merge buffer.  Localization is permanent for any particular merge buffer."
+
+With prefix argument LOCALIZE, `emerge-combine-versions-template'
+is made local to this merge buffer.  Localization is permanent
+for any particular merge buffer."
   (interactive "s\nP")
   (if localize
       (make-local-variable 'emerge-combine-versions-template))
@@ -2464,8 +2467,10 @@ merge buffer.  Localization is permanent for any 
particular merge buffer."
 (defun emerge-set-combine-versions-template (start end &optional localize)
   "Copy region into `emerge-combine-versions-template'.
 This controls how `emerge-combine-versions' will combine the two versions.
-With prefix argument, `emerge-combine-versions-template' is made local to this
-merge buffer.  Localization is permanent for any particular merge buffer."
+
+With prefix argument LOCALIZE, `emerge-combine-versions-template'
+is made local to this merge buffer.  Localization is permanent
+for any particular merge buffer."
   (interactive "r\nP")
   (if localize
       (make-local-variable 'emerge-combine-versions-template))
@@ -2479,8 +2484,9 @@ merge buffer.  Localization is permanent for any 
particular merge buffer."
   "Combine versions using the template in `emerge-combine-versions-template'.
 Refuses to function if this difference has been edited, i.e., if it is
 neither the A nor the B variant.
-An argument forces the variant to be selected even if the difference has
-been edited."
+
+With prefix argument FORCE, force the variant to be selected even
+if the difference has been edited."
   (interactive "P")
   (emerge-combine-versions-internal emerge-combine-versions-template force))
 
@@ -2490,8 +2496,9 @@ See documentation of the variable 
`emerge-combine-versions-template'
 for how the template is interpreted.
 Refuses to function if this difference has been edited, i.e., if it is
 neither the A nor the B variant.
-An argument forces the variant to be selected even if the difference has
-been edited.
+
+With prefix argument CHAR, force the variant to be selected even
+if the difference has been edited.
 
 Interactively, reads the register using `register-read-with-preview'."
   (interactive (list
@@ -2539,9 +2546,9 @@ Interactively, reads the register using 
`register-read-with-preview'."
     (if emerge-auto-advance (emerge-next-difference))))
 
 (defun emerge-set-merge-mode (mode)
-  "Set the major mode in a merge buffer.
-Overrides any change that the mode might make to the mode line or local
-keymap.  Leaves merge in fast mode."
+  "Set the major mode to MODE in a merge buffer.
+Override any change that the mode might make to the mode line or
+local keymap.  Leave merge in fast mode."
   (interactive
    (list (intern (completing-read "New major mode for merge buffer: "
                                  obarray 'commandp t nil))))
@@ -2678,8 +2685,8 @@ keymap.  Leaves merge in fast mode."
        (emerge-refresh-mode-line))))
 
 (defun emerge-select-version (force a-version b-version neither-version)
-  "Perform tests to see whether user should be allowed to select a version
-of this difference:
+  "Test if user should be allowed to select a version of this difference.
+This is the case if:
   a valid difference has been selected; and
   the difference text in the merge buffer is:
     the A version (execute a-version), or
@@ -2847,7 +2854,9 @@ Otherwise, signal an error."
 ;; When the pointless option emerge-temp-file-prefix goes,
 ;; make this function obsolete too, and just use make-temp-file.
 (defun emerge-make-temp-file (prefix)
-  "Make a private temporary file based on `emerge-temp-file-prefix'."
+  "Make a private temporary file based on PREFIX.
+This is named by concatenating `emerge-temp-file-prefix' with
+PREFIX."
   (make-temp-file (concat emerge-temp-file-prefix prefix)))
 
 ;;; Functions that query the user before he can write out the current buffer.
diff --git a/lisp/vc/log-view.el b/lisp/vc/log-view.el
index bc66191f33..c2f008fc47 100644
--- a/lisp/vc/log-view.el
+++ b/lisp/vc/log-view.el
@@ -50,7 +50,7 @@
 ;; ------------------------------------------------------------------------
 ;; r4622 | ckuethe | 2007-12-23 18:18:01 -0500 (Sun, 23 Dec 2007) | 2 lines
 ;;
-;; uBlox AEK-4T in binary mode. Added to unstable because it breaks gpsfake
+;; uBlox AEK-4T in binary mode.  Added to unstable because it breaks gpsfake
 ;;
 ;; ------------------------------------------------------------------------
 ;; r4621 | ckuethe | 2007-12-23 16:48:11 -0500 (Sun, 23 Dec 2007) | 3 lines
diff --git a/lisp/vc/pcvs.el b/lisp/vc/pcvs.el
index 23f0902b38..726fe4e283 100644
--- a/lisp/vc/pcvs.el
+++ b/lisp/vc/pcvs.el
@@ -672,7 +672,7 @@ it is finished."
          (when cvs-postproc
            (if (null procbuf)
                ;;(set-process-buffer proc nil)
-               (error "cvs' process buffer was killed")
+                (error "CVS process buffer was killed")
              (with-current-buffer procbuf
                ;; Do the postprocessing like parsing and such.
                (save-excursion
@@ -1503,7 +1503,7 @@ The POSTPROC specified there (typically `log-edit') is 
then called,
 (defvar cvs-edit-log-revision)
 (defvar cvs-edit-log-files) (put 'cvs-edit-log-files 'permanent-local t)
 (defun cvs-mode-edit-log (file rev &optional text)
-  "Edit the log message at point.
+  "Edit log message at point.
 This is best called from a `log-view-mode' buffer."
   (interactive
    (list
@@ -1661,7 +1661,7 @@ See `cvs-mode-diff' for more info."
 This command can be used on files that are marked with \"Merged\"
 or \"Conflict\" in the *cvs* buffer."
   (interactive (list (cvs-flags-query 'cvs-diff-flags "diff flags")))
-  (unless (listp flags) (error "flags should be a list of strings"))
+  (unless (listp flags) (error "Flags should be a list of strings"))
   (save-some-buffers)
   (let* ((marked (cvs-get-marked (cvs-ignore-marks-p "diff")))
         (fis (car (cvs-partition 'cvs-fileinfo->backup-file marked))))
@@ -1862,7 +1862,7 @@ POSTPROC is a function of no argument to be evaluated at 
the very end (after
   (let ((def-dir default-directory))
     ;; Save the relevant buffers
     (save-some-buffers nil (lambda () (cvs-is-within-p fis def-dir))))
-  (unless (listp flags) (error "flags should be a list of strings"))
+  (unless (listp flags) (error "Flags should be a list of strings"))
   ;; Some w32 versions of CVS don't like an explicit . too much.
   (when (and (car fis) (null (cdr fis))
             (eq (cvs-fileinfo->type (car fis)) 'DIRCHANGE)
@@ -2259,7 +2259,7 @@ With prefix argument, prompt for cvs flags."
 ;;;;
 
 (defun cvs-dir-member-p (fileinfo dir)
-  "Return true if FILEINFO represents a file in directory DIR."
+  "Return non-nil if FILEINFO represents a file in directory DIR."
   (and (not (eq (cvs-fileinfo->type fileinfo) 'DIRCHANGE))
        (string-prefix-p dir (cvs-fileinfo->dir fileinfo))))
 
@@ -2316,7 +2316,7 @@ this file, or a list of arguments to send to the program."
 
 
 (defun cvs-change-cvsroot (newroot)
-  "Change the CVSROOT."
+  "Change the CVSROOT to NEWROOT."
   (interactive "DNew repository: ")
   (if (or (file-directory-p (expand-file-name "CVSROOT" newroot))
          (y-or-n-p (concat "Warning: no CVSROOT found inside repository."
diff --git a/lisp/vc/smerge-mode.el b/lisp/vc/smerge-mode.el
index 956d9b3801..b2a875c81f 100644
--- a/lisp/vc/smerge-mode.el
+++ b/lisp/vc/smerge-mode.el
@@ -961,7 +961,7 @@ It has the following disadvantages:
 (defvar smerge--refine-long-words)
 
 (defun smerge--refine-chopup-region (beg end file &optional preproc)
-  "Chopup the region into small elements, one per line.
+  "Chopup the region from BEG to END into small elements, one per line.
 Save the result into FILE.
 If non-nil, PREPROC is called with no argument in a buffer that contains
 a copy of the text, just before chopping it up.  It can be used to replace
diff --git a/lisp/vc/vc-annotate.el b/lisp/vc/vc-annotate.el
index 82531f742e..45bb17749b 100644
--- a/lisp/vc/vc-annotate.el
+++ b/lisp/vc/vc-annotate.el
@@ -545,6 +545,7 @@ Return a cons (REV . FILENAME)."
 
 (defvar log-view-vc-backend)
 (defvar log-view-vc-fileset)
+(defvar vc-git-print-log-follow)
 
 (defun vc-annotate-show-log-revision-at-line ()
   "Visit the log of the revision at line.
@@ -559,6 +560,8 @@ the file in question, search for the log entry required and 
move point."
          (message "Cannot extract revision number from the current line")
        (let ((backend vc-annotate-backend)
              (log-buf (get-buffer "*vc-change-log*"))
+              ;; No need to follow renames: we specify the historical file 
name.
+              vc-git-print-log-follow
              pos)
          (if (and
               log-buf
diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el
index ebecdff62e..f8b87170af 100644
--- a/lisp/vc/vc-dir.el
+++ b/lisp/vc/vc-dir.el
@@ -374,7 +374,7 @@ See `run-hooks'."
   "Keymap for directory buffer.")
 
 (defmacro vc-dir-at-event (event &rest body)
-  "Evaluate BODY with point located at event-start of EVENT.
+  "Evaluate BODY with point located at `event-start' of EVENT.
 If BODY uses EVENT, it should be a variable,
  otherwise it will be evaluated twice."
   (let ((posn (make-symbol "vc-dir-at-event-posn")))
@@ -567,7 +567,7 @@ If NOINSERT, ignore elements on ENTRIES which are not in 
the ewoc."
 
 (defun vc-dir-next-line (arg)
   "Go to the next line.
-If a prefix argument is given, move by that many lines."
+With prefix argument ARG, move that many lines."
   (interactive "p")
   (with-no-warnings
     (ewoc-goto-next vc-ewoc arg)
@@ -575,7 +575,7 @@ If a prefix argument is given, move by that many lines."
 
 (defun vc-dir-previous-line (arg)
   "Go to the previous line.
-If a prefix argument is given, move by that many lines."
+With prefix argument ARG, move that many lines."
   (interactive "p")
   (ewoc-goto-prev vc-ewoc arg)
   (vc-dir-move-to-goal-column))
@@ -703,7 +703,7 @@ line."
 
 (defun vc-dir-mark-all-files (arg)
   "Mark all files with the same state as the current one.
-With a prefix argument mark all files (not directories).
+With prefix argument ARG, mark all files (not directories).
 If the current entry is a directory, mark all child files.
 
 The commands operate on files that are on the same state.
@@ -813,7 +813,7 @@ line."
 
 (defun vc-dir-unmark-all-files (arg)
   "Unmark all files with the same state as the current one.
-With a prefix argument unmark all files.
+With prefix argument ARG, unmark all files.
 If the current entry is a directory, unmark all the child files.
 
 The commands operate on files that are on the same state.
@@ -1181,7 +1181,7 @@ specific headers."
    "\n"))
 
 (defun vc-dir-refresh-files (files)
-  "Refresh some files in the *VC-dir* buffer."
+  "Refresh some FILES in the *VC-dir* buffer."
   (let ((def-dir default-directory)
        (backend vc-dir-backend))
     (vc-set-mode-line-busy-indicator)
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index ec572e96a5..eca8d547a9 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -897,8 +897,7 @@ The car of the list is the current branch."
 (declare-function log-edit--toggle-amend "log-edit" (last-msg-fn))
 
 (defun vc-git-log-edit-toggle-signoff ()
-  "Toggle whether to add the \"Signed-off-by\" line at the end of
-the commit message."
+  "Toggle whether to add the \"Signed-off-by\" line at the end of commit 
message."
   (interactive)
   (log-edit-toggle-header "Sign-Off" "yes"))
 
@@ -1148,6 +1147,14 @@ This prompts for a branch to merge from."
 
 (autoload 'vc-setup-buffer "vc-dispatcher")
 
+;; It's a weird option due to how Git handles '--follow', and it can
+;; hide certain (usually merge) commits in the `vc-print-log' buffers.
+;;
+;; (setq vc-git-log-switches '("-m")) can fix that, but at the cost of
+;; duplicating many merge commits in the log.
+;;
+;; Long explanation here:
+;; 
https://stackoverflow.com/questions/46487476/git-log-follow-graph-skips-commits
 (defcustom vc-git-print-log-follow nil
   "If true, follow renames in Git logs for a single file."
   :type 'boolean
@@ -1613,8 +1620,8 @@ before it is executed.
 With two \\[universal-argument] prefixes, directly edit and run `grep-command'.
 
 Collect output in a buffer.  While git grep runs asynchronously, you
-can use \\[next-error] (M-x next-error), or 
\\<grep-mode-map>\\[compile-goto-error] \
-in the grep output buffer,
+can use \\[next-error] (`next-error'), or \\<grep-mode-map>\
+\\[compile-goto-error] in the grep output buffer,
 to go to the lines where grep found matches.
 
 This command shares argument histories with \\[rgrep] and \\[grep]."
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el
index 1e8d673852..0ed9f7c31f 100644
--- a/lisp/vc/vc-hg.el
+++ b/lisp/vc/vc-hg.el
@@ -137,8 +137,7 @@ switches."
   :version "25.1")
 
 (defcustom vc-hg-revert-switches nil
-  "String or list of strings specifying switches for hg revert
-under VC."
+  "String or list of strings specifying switches for hg revert under VC."
   :type '(choice (const :tag "None" nil)
                 (string :tag "Argument String")
                 (repeat :tag "Argument List" :value ("") string))
@@ -643,8 +642,8 @@ Variable `vc-hg-create-bookmark' controls what kind of 
branch will be created."
 ;;; Native data structure reading
 
 (defcustom vc-hg-parse-hg-data-structures t
-  "If true, try directly parsing Mercurial data structures
-directly instead of always running Mercurial.  We try to be safe
+  "If true, try parsing Mercurial data structures directly.
+This is done instead of always running Mercurial.  We try to be safe
 against Mercurial data structure format changes and always fall
 back to running Mercurial directly."
   :type 'boolean
@@ -1017,9 +1016,9 @@ FILENAME must be the file's true absolute name."
     "remotefilelog"
     "revlogv1"
     "store")
-  "List of Mercurial repository requirements we understand; if a
-repository requires features not present in this list, we avoid
-attempting to parse Mercurial data structures.")
+  "List of Mercurial repository requirements we understand.
+If a repository requires features not present in this list, we
+avoid attempting to parse Mercurial data structures.")
 
 (defun vc-hg--requirements-understood-p (repo)
   "Check that we understand the format of the given repository.
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index 0612310640..b7760e3bba 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -256,9 +256,9 @@ It is usually called via the `vc-call' macro."
 (defmacro vc-call (fun file &rest args)
   "A convenience macro for calling VC backend functions.
 Functions called by this macro must accept FILE as the first argument.
-ARGS specifies any additional arguments.  FUN should be unquoted.
-BEWARE!! FILE is evaluated twice!!"
-  `(vc-call-backend (vc-backend ,file) ',fun ,file ,@args))
+ARGS specifies any additional arguments.  FUN should be unquoted."
+  (macroexp-let2 nil file file
+    `(vc-call-backend (vc-backend ,file) ',fun ,file ,@args)))
 
 (defsubst vc-parse-buffer (pattern i)
   "Find PATTERN in the current buffer and return its Ith submatch."
diff --git a/lisp/wdired.el b/lisp/wdired.el
index eafb50cc18..eb5a638556 100644
--- a/lisp/wdired.el
+++ b/lisp/wdired.el
@@ -453,7 +453,7 @@ non-nil means return old filename."
   (remove-function (local 'revert-buffer-function) #'wdired-revert))
 
 (defun wdired-abort-changes ()
-  "Abort changes and return to dired mode."
+  "Abort changes and return to `dired-mode'."
   (interactive)
   (remove-hook 'before-change-functions #'wdired--before-change-fn t)
   (let ((inhibit-read-only t))
@@ -689,7 +689,7 @@ Optional arguments are ignored."
   ;; FIXME: Can't we use the normal mechanism for that?  --Stef
   (if (and
        (buffer-modified-p)
-       (not (y-or-n-p "Buffer changed. Discard changes and kill buffer?")))
+       (not (y-or-n-p "Buffer changed.  Discard changes and kill buffer?")))
       (error "Error")))
 
 ;; Added to after-change-functions in wdired-change-to-wdired-mode to
diff --git a/lisp/whitespace.el b/lisp/whitespace.el
index 7e090177eb..d4f2b2890a 100644
--- a/lisp/whitespace.el
+++ b/lisp/whitespace.el
@@ -565,8 +565,8 @@ Used when `whitespace-style' includes the value 
`space-before-tab'.")
 
 
 (defvar whitespace-indentation 'whitespace-indentation
-  "Symbol face used to visualize `tab-width' or more SPACEs at beginning of
-line.  Used when `whitespace-style' includes the value `indentation'.")
+  "Symbol face used to visualize `tab-width' or more SPACEs at beginning of 
line.
+Used when `whitespace-style' includes the value `indentation'.")
 (make-obsolete-variable 'whitespace-indentation "use the face instead." "24.4")
 
 (defface whitespace-indentation
@@ -1722,30 +1722,32 @@ cleaning up these problems."
               (ws-tab-width tab-width))
           (with-current-buffer (get-buffer-create
                                 whitespace-report-buffer-name)
-            (erase-buffer)
-            (insert (if ws-indent-tabs-mode
-                        (car whitespace-report-text)
-                      (cdr whitespace-report-text)))
-            (goto-char (point-min))
-            (forward-line 3)
-            (dolist (option whitespace-report-list)
+            (let ((inhibit-read-only t))
+              (special-mode)
+              (erase-buffer)
+              (insert (if ws-indent-tabs-mode
+                          (car whitespace-report-text)
+                        (cdr whitespace-report-text)))
+              (goto-char (point-min))
+              (forward-line 3)
+              (dolist (option whitespace-report-list)
+                (forward-line 1)
+                (whitespace-mark-x
+                 27 (memq (car option) style))
+                (whitespace-mark-x 7 (car bogus-list))
+                (setq bogus-list (cdr bogus-list)))
               (forward-line 1)
-              (whitespace-mark-x
-               27 (memq (car option) style))
-              (whitespace-mark-x 7 (car bogus-list))
-              (setq bogus-list (cdr bogus-list)))
-            (forward-line 1)
-            (whitespace-insert-value ws-indent-tabs-mode)
-            (whitespace-insert-value ws-tab-width)
-            (when has-bogus
-              (goto-char (point-max))
-              (insert (substitute-command-keys
-                       " Type `\\[whitespace-cleanup]'")
-                      " to cleanup the buffer.\n\n"
-                      (substitute-command-keys
-                       " Type `\\[whitespace-cleanup-region]'")
-                      " to cleanup a region.\n\n"))
-            (whitespace-display-window (current-buffer)))))
+              (whitespace-insert-value ws-indent-tabs-mode)
+              (whitespace-insert-value ws-tab-width)
+              (when has-bogus
+                (goto-char (point-max))
+                (insert (substitute-command-keys
+                         " Type `\\[whitespace-cleanup]'")
+                        " to cleanup the buffer.\n\n"
+                        (substitute-command-keys
+                         " Type `\\[whitespace-cleanup-region]'")
+                        " to cleanup a region.\n\n"))
+              (whitespace-display-window (current-buffer))))))
       has-bogus)))
 
 
@@ -1834,17 +1836,14 @@ cleaning up these problems."
 
 
 (defun whitespace-display-window (buffer)
-  "Display BUFFER in a new window."
+  "Display BUFFER, preferably below the selected window."
   (goto-char (point-min))
   (set-buffer-modified-p nil)
-  (when (< (window-height) (* 2 window-min-height))
-    (kill-buffer buffer)
-    (error "Window height is too small; \
-can't split window to display whitespace toggle options"))
-  (let ((win (split-window)))
-    (set-window-buffer win buffer)
-    (shrink-window-if-larger-than-buffer win)))
-
+  (let ((window (display-buffer
+                buffer
+                `((display-buffer-reuse-window
+                   display-buffer-below-selected)))))
+    (shrink-window-if-larger-than-buffer window)))
 
 (defun whitespace-kill-buffer (buffer-name)
   "Kill buffer BUFFER-NAME and windows related with it."
@@ -2355,7 +2354,7 @@ Also refontify when necessary."
 
 
 (defun whitespace-display-vector-p (vec)
-  "Return true if every character in vector VEC can be displayed."
+  "Return non-nil if every character in vector VEC can be displayed."
   (let ((i (length vec)))
     (when (> i 0)
       (while (and (>= (setq i (1- i)) 0)
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 9a34dc8d43..ab358da7e3 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -190,7 +190,7 @@ the contents of strings."
   (buffer-enable-undo))
 
 (defcustom widget-menu-max-size 40
-  "Largest number of items allowed in a popup-menu.
+  "Largest number of items allowed in a popup menu.
 Larger menus are read through the minibuffer."
   :group 'widgets
   :type 'integer)
@@ -202,9 +202,8 @@ For a larger number of items, the minibuffer is used."
   :type 'integer)
 
 (defcustom widget-menu-minibuffer-flag nil
-  "Control how to ask for a choice from the keyboard.
-Non-nil means use the minibuffer;
-nil means read a single character."
+  "Non-nil means use the minibuffer; to ask for a choice from the keyboard.
+If nil, read a single character."
   :group 'widgets
   :type 'boolean)
 
diff --git a/lisp/woman.el b/lisp/woman.el
index fe9f8969c3..1ca4d5e871 100644
--- a/lisp/woman.el
+++ b/lisp/woman.el
@@ -1790,7 +1790,7 @@ Argument EVENT is the invoking mouse event."
   ;; That comment was moved after the symbol `woman-menu' to make
   ;; find-function-search-for-symbol work. -- rost
  woman-mode-map
- "WoMan Menu"
+ "WoMan Menu."
  `("WoMan"
    ["WoMan..." woman t]                        ; [NAME CALLBACK ENABLE]
    "--"
@@ -2182,7 +2182,7 @@ To be called on original buffer and any .so insertions."
 ;; variable.  zsoelim is always run as the very first preprocessor.
 
 (defvar woman-emulate-tbl nil
-  "True if WoMan should emulate the tbl preprocessor.
+  "Non-nil if WoMan should emulate the tbl preprocessor.
 This applies to text between .TE and .TS directives.
 Currently set only from \\='\\\" t in the first line of the source file.")
 
diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index f8cb7a7add..8c593abea8 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -352,7 +352,9 @@ When you set this variable to nil, consider further 
customization with
   :type 'boolean)
 
 (defun xwidget-webkit-bookmark-make-record ()
-  "Create bookmark record in webkit xwidget."
+  "Create bookmark record in webkit xwidget.
+See `xwidget-webkit-bookmark-jump-new-session' for whether this
+should create a new session or not."
   (nconc (bookmark-make-record-default t t)
          `((page . ,(xwidget-webkit-uri (xwidget-webkit-current-session)))
            (handler  . (lambda (bmk)
diff --git a/src/Makefile.in b/src/Makefile.in
index 732cd8f099..c11d96d2c4 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -545,7 +545,13 @@ charscript = ${lispintdir}/charscript.el
 ${charscript}: FORCE
        $(MAKE) -C ../admin/unidata $(notdir $@)
 
-${lispintdir}/characters.elc: ${charscript:.el=.elc}
+emoji-zwj = ${lispintdir}/emoji-zwj.el
+${emoji-zwj}: FORCE
+       $(MAKE) -C ../admin/unidata $(notdir $@)
+
+${lispintdir}/characters.elc: ${charscript:.el=.elc} ${emoji-zwj:.el=.elc}
+
+SYSTEM_TYPE = @SYSTEM_TYPE@
 
 ## The dumped Emacs is as functional and more efficient than
 ## bootstrap-emacs, so we replace the latter with the former.
@@ -555,6 +561,9 @@ ${lispintdir}/characters.elc: ${charscript:.el=.elc}
 emacs$(EXEEXT): temacs$(EXEEXT) \
                 lisp.mk $(etc)/DOC $(lisp) \
                 $(lispsource)/international/charprop.el ${charsets}
+ifeq ($(SYSTEM_TYPE),cygwin)
+       find ${top_builddir} -name '*.eln' | rebase -v -O -T -
+endif
 ifeq ($(DUMPING),unexec)
        LC_ALL=C $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup --temacs=dump
   ifneq ($(PAXCTL_dumped),)
@@ -629,7 +638,7 @@ endif
 ## This goes on to affect various things, and the emacs binary fails
 ## to start if Vinstallation_directory has the wrong value.
 temacs$(EXEEXT): $(LIBXMENU) $(ALLOBJS) $(LIBEGNU_ARCHIVE) $(EMACSRES) \
-  $(charsets) $(charscript) $(MAKE_PDUMPER_FINGERPRINT)
+  $(charsets) $(charscript) ${emoji-zwj} $(MAKE_PDUMPER_FINGERPRINT)
        $(AM_V_CCLD)$(CC) -o $@.tmp \
          $(ALL_CFLAGS) $(TEMACS_LDFLAGS) $(LDFLAGS) \
          $(ALLOBJS) $(LIBEGNU_ARCHIVE) $(W32_RES_LINK) $(LIBES)
diff --git a/src/buffer.h b/src/buffer.h
index 24e9c3fcbc..8623bed08e 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -60,6 +60,14 @@ enum { BEG = 1, BEG_BYTE = BEG };
 
 /* Macros for the addresses of places in the buffer.  */
 
+/* WARNING: Use the 'char *' pointers to buffer text with care in code
+   that could GC: GC can relocate buffer text, invalidating such
+   pointers.  It is best to use character or byte position instead,
+   delaying the access through BYTE_POS_ADDR etc. pointers to the
+   latest possible moment.  If you must use the 'char *' pointers
+   (e.g., for speed), be sure to adjust them after any call that could
+   potentially GC.  */
+
 /* Address of beginning of buffer.  */
 #define BEG_ADDR (current_buffer->text->beg)
 
@@ -1002,6 +1010,9 @@ SET_BUF_PT_BOTH (struct buffer *buf, ptrdiff_t charpos, 
ptrdiff_t byte)
    or convert between a byte position and an address.
    These functions do not check that the position is in range.  */
 
+/* See the important WARNING above about using the 'char *' pointers
+   returned by these functions.  */
+
 /* Return the address of byte position N in current buffer.  */
 
 INLINE unsigned char *
diff --git a/src/coding.c b/src/coding.c
index d027c7d539..7030a53869 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -10430,8 +10430,7 @@ encode_file_name (Lisp_Object fname)
      cause subtle bugs because the system would silently use a
      different filename than expected.  Perform this check after
      encoding to not miss NUL bytes introduced through encoding.  */
-  CHECK_TYPE (memchr (SSDATA (encoded), '\0', SBYTES (encoded)) == NULL,
-              Qfilenamep, fname);
+  CHECK_STRING_NULL_BYTES (encoded);
   return encoded;
 }
 
diff --git a/src/comp.c b/src/comp.c
index fbf6a3c670..bc1adcf4e2 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -705,6 +705,12 @@ comp_hash_source_file (Lisp_Object filename)
   /* Can't use Finsert_file_contents + Fbuffer_hash as this is called
      by Fcomp_el_to_eln_filename too early during bootstrap.  */
   bool is_gz = suffix_p (filename, ".gz");
+#ifndef HAVE_ZLIB
+  if (is_gz)
+    xsignal2 (Qfile_notify_error,
+             build_string ("Cannot natively compile compressed *.el files 
without zlib support"),
+             filename);
+#endif
   Lisp_Object encoded_filename = ENCODE_FILE (filename);
   FILE *f = emacs_fopen (SSDATA (encoded_filename), is_gz ? "rb" : "r");
 
@@ -713,9 +719,13 @@ comp_hash_source_file (Lisp_Object filename)
 
   Lisp_Object digest = make_uninit_string (MD5_DIGEST_SIZE * 2);
 
+#ifdef HAVE_ZLIB
   int res = is_gz
     ? md5_gz_stream (f, SSDATA (digest))
     : md5_stream (f, SSDATA (digest));
+#else
+  int res = md5_stream (f, SSDATA (digest));
+#endif
   fclose (f);
 
   if (res)
@@ -4041,7 +4051,13 @@ make_directory_wrapper_1 (Lisp_Object ignore)
 
 DEFUN ("comp-el-to-eln-rel-filename", Fcomp_el_to_eln_rel_filename,
        Scomp_el_to_eln_rel_filename, 1, 1, 0,
-       doc: /* Return the corresponding .eln relative filename.  */)
+       doc: /* Return the relative name of the .eln file for FILENAME.
+FILENAME must exist, and if it's a symlink, the target must exist.
+If FILENAME is compressed, it must have the \".gz\" extension,
+and Emacs must have been compiled with zlib; the file will be
+uncompressed on the fly to hash its contents.
+Value includes the original base name, followed by 2 hash values,
+one for the file name and another for its contents, followed by .eln.  */)
   (Lisp_Object filename)
 {
   CHECK_STRING (filename);
@@ -4126,10 +4142,22 @@ DEFUN ("comp-el-to-eln-rel-filename", 
Fcomp_el_to_eln_rel_filename,
 
 DEFUN ("comp-el-to-eln-filename", Fcomp_el_to_eln_filename,
        Scomp_el_to_eln_filename, 1, 2, 0,
-       doc: /* Return the .eln filename for source FILENAME to used
-for new compilations.
-If BASE-DIR is non-nil use it as a base directory, look for a suitable
-directory in `comp-eln-load-path' otherwise.  */)
+       doc: /* Return the absolute .eln file name for source FILENAME.
+The resulting .eln file name is intended to be used for natively
+compiling FILENAME.  FILENAME must exist and be readable, but other
+than that, its leading directories are ignored when constructing
+the name of the .eln file.
+If BASE-DIR is non-nil, use it as the directory for the .eln file;
+non-absolute BASE-DIR is interpreted as relative to `invocation-directory'.
+If BASE-DIR is omitted or nil, look for the first writable directory
+in `native-comp-eln-load-path', and use as BASE-DIR its subdirectory
+whose name is given by `comp-native-version-dir'.
+If FILENAME specifies a preloaded file, the directory for the .eln
+file is the \"preloaded/\" subdirectory of the directory determined
+as described above.  FILENAME is considered to be a preloaded file if
+the value of `comp-file-preloaded-p' is non-nil, or if FILENAME
+appears in the value of the environment variable LISP_PRELOADED;
+the latter is supposed to be used by the Emacs build procedure.  */)
   (Lisp_Object filename, Lisp_Object base_dir)
 {
   Lisp_Object source_filename = filename;
@@ -4707,7 +4735,7 @@ helper_PSEUDOVECTOR_TYPEP_XUNTAG (Lisp_Object a, enum 
pvec_type code)
 }
 
 
-/* `comp-eln-load-path' clean-up support code.  */
+/* `native-comp-eln-load-path' clean-up support code.  */
 
 static Lisp_Object all_loaded_comp_units_h;
 
@@ -4722,7 +4750,7 @@ return_nil (Lisp_Object arg)
 /* Windows does not let us delete a .eln file that is currently loaded
    by a process.  The strategy is to rename .eln files into .old.eln
    instead of removing them when this is not possible and clean-up
-   `comp-eln-load-path' when exiting.
+   `native-comp-eln-load-path' when exiting.
 
    Any error is ignored because it may be due to the file being loaded
    in another Emacs instance.  */
@@ -4850,7 +4878,7 @@ maybe_defer_native_compilation (Lisp_Object function_name,
 /**************************************/
 
 /* Fixup the system eln-cache directory, which is the last entry in
-   `comp-eln-load-path'.  Argument is a .eln file in that directory.  */
+   `native-comp-eln-load-path'.  Argument is a .eln file in that directory.  */
 void
 fixup_eln_load_path (Lisp_Object eln_filename)
 {
diff --git a/src/data.c b/src/data.c
index 27b642df28..0d3376f090 100644
--- a/src/data.c
+++ b/src/data.c
@@ -681,7 +681,7 @@ global value outside of any lexical scope.  */)
 /* It has been previously suggested to make this function an alias for
    symbol-function, but upon discussion at Bug#23957, there is a risk
    breaking backward compatibility, as some users of fboundp may
-   expect `t' in particular, rather than any true value.  */
+   expect t in particular, rather than any true value.  */
 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0,
        doc: /* Return t if SYMBOL's function definition is not void.  */)
   (Lisp_Object symbol)
diff --git a/src/dispnew.c b/src/dispnew.c
index 0c31319917..69c2023fdf 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -6704,7 +6704,7 @@ See `buffer-display-table' for more information.  */);
 
   DEFVAR_LISP ("tab-bar-position", Vtab_bar_position,
               doc: /* Specify on which side from the tool bar the tab bar 
shall be.
-Possible values are `t' (below the tool bar), `nil' (above the tool bar).
+Possible values are t (below the tool bar), nil (above the tool bar).
 This option affects only builds where the tool bar is not external.  */);
 
   pdumper_do_now_and_after_load (syms_of_display_for_pdumper);
diff --git a/src/eval.c b/src/eval.c
index 48104bd0f4..2bb7cfe600 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -364,9 +364,6 @@ do_debug_on_call (Lisp_Object code, ptrdiff_t count)
   call_debugger (list1 (code));
 }
 
-/* NOTE!!! Every function that can call EVAL must protect its args
-   and temporaries from garbage collection while it needs them.
-   The definition of `For' shows what you have to do.  */
 
 DEFUN ("or", For, Sor, 0, UNEVALLED, 0,
        doc: /* Eval args until one of them yields non-nil, then return that 
value.
@@ -1174,14 +1171,6 @@ usage: (catch TAG BODY...)  */)
    FUNC should return a Lisp_Object.
    This is how catches are done from within C code.  */
 
-/* MINIBUFFER_QUIT_LEVEL is to handle quitting from nested minibuffers by
-   throwing t to tag `exit'.
-   0 means there is no (throw 'exit t) in progress, or it wasn't from
-     a minibuffer which isn't the most nested;
-   N > 0 means the `throw' was done from the minibuffer at level N which
-     wasn't the most nested.  */
-EMACS_INT minibuffer_quit_level = 0;
-
 Lisp_Object
 internal_catch (Lisp_Object tag,
                Lisp_Object (*func) (Lisp_Object), Lisp_Object arg)
@@ -1189,9 +1178,6 @@ internal_catch (Lisp_Object tag,
   /* This structure is made part of the chain `catchlist'.  */
   struct handler *c = push_handler (tag, CATCHER);
 
-  if (EQ (tag, Qexit))
-    minibuffer_quit_level = 0;
-
   /* Call FUNC.  */
   if (! sys_setjmp (c->jmp))
     {
@@ -1205,17 +1191,6 @@ internal_catch (Lisp_Object tag,
       Lisp_Object val = handlerlist->val;
       clobbered_eassert (handlerlist == c);
       handlerlist = handlerlist->next;
-      if (EQ (tag, Qexit) && EQ (val, Qt) && minibuffer_quit_level > 0)
-       /* If we've thrown t to tag `exit' from within a minibuffer, we
-          exit all minibuffers more deeply nested than the current
-          one.  */
-       {
-         if (minibuf_level > minibuffer_quit_level
-             && !NILP (Fminibuffer_innermost_command_loop_p (Qnil)))
-            Fthrow (Qexit, Qt);
-         else
-           minibuffer_quit_level = 0;
-       }
       return val;
     }
 }
diff --git a/src/fileio.c b/src/fileio.c
index 0db8ed793b..3c13d3fe41 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -945,6 +945,7 @@ the root directory.  */)
   USE_SAFE_ALLOCA;
 
   CHECK_STRING (name);
+  CHECK_STRING_NULL_BYTES (name);
 
   /* If the file name has special constructs in it,
      call the corresponding file name handler.  */
@@ -993,7 +994,10 @@ the root directory.  */)
       if (STRINGP (dir))
        {
          if (file_name_absolute_no_tilde_p (dir))
-           default_directory = dir;
+           {
+             CHECK_STRING_NULL_BYTES (dir);
+             default_directory = dir;
+           }
          else
            {
              Lisp_Object absdir
diff --git a/src/fns.c b/src/fns.c
index 4e74589ef2..a72e41aee5 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -322,7 +322,7 @@ Letter-case is significant, but text properties are 
ignored. */)
 
   USE_SAFE_ALLOCA;
   ptrdiff_t *column = SAFE_ALLOCA ((len1 + 1) * sizeof (ptrdiff_t));
-  for (y = 1; y <= len1; y++)
+  for (y = 0; y <= len1; y++)
     column[y] = y;
 
   if (use_byte_compare)
diff --git a/src/keyboard.c b/src/keyboard.c
index 63bf29a948..bc6f97586d 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -753,10 +753,21 @@ DEFUN ("recursive-edit", Frecursive_edit, 
Srecursive_edit, 0, 0, "",
        doc: /* Invoke the editor command loop recursively.
 To get out of the recursive edit, a command can throw to `exit' -- for
 instance (throw \\='exit nil).
-If you throw a value other than t, `recursive-edit' returns normally
-to the function that called it.  Throwing a t value causes
-`recursive-edit' to quit, so that control returns to the command loop
-one level up.
+
+The following values (last argument to `throw') can be used when
+throwing to \\='exit:
+
+- t causes `recursive-edit' to quit, so that control returns to the
+  command loop one level up.
+
+- A string causes `recursive-edit' to signal an error, printing that
+  string as the error message.
+
+- A function causes `recursive-edit' to call that function with no
+  arguments, and then return normally.
+
+- Any other value causes `recursive-edit' to return normally to the
+  function that called it.
 
 This function is called by the editor initialization to begin editing.  */)
   (void)
diff --git a/src/keymap.c b/src/keymap.c
index fb8eceaec1..be45d2be1e 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -2935,7 +2935,7 @@ describe_vector (Lisp_Object vector, Lisp_Object prefix, 
Lisp_Object args,
   Lisp_Object suppress = Qnil;
   bool first = true;
   /* Range of elements to be handled.  */
-  int from, to, stop;
+  int to, stop;
 
   if (!keymap_p)
     {
@@ -2955,17 +2955,19 @@ describe_vector (Lisp_Object vector, Lisp_Object 
prefix, Lisp_Object args,
   if (partial)
     suppress = intern ("suppress-keymap");
 
-  from = 0;
+  /* STOP is a boundary between normal characters (-#x3FFF7F) and
+     8-bit characters (#x3FFF80-), used below when VECTOR is a
+     char-table.  */
   if (CHAR_TABLE_P (vector))
     stop = MAX_5_BYTE_CHAR + 1, to = MAX_CHAR + 1;
   else
     stop = to = ASIZE (vector);
 
-  for (int i = from; ; i++)
+  for (int i = 0; ; i++)
     {
       bool this_shadowed = false;
       Lisp_Object shadowed_by = Qnil;
-      int range_beg, range_end;
+      int range_beg;
       Lisp_Object val, tem2;
 
       maybe_quit ();
@@ -2981,6 +2983,10 @@ describe_vector (Lisp_Object vector, Lisp_Object prefix, 
Lisp_Object args,
 
       if (CHAR_TABLE_P (vector))
        {
+         /* Find the value in VECTOR for the first character in the
+            range [RANGE_BEG..STOP), and update the range to include
+            only the characters whose value is the same as that of
+            the first in the range.  */
          range_beg = i;
          i = stop - 1;
          val = char_table_ref_and_range (vector, range_beg, &range_beg, &i);
@@ -3039,33 +3045,26 @@ describe_vector (Lisp_Object vector, Lisp_Object 
prefix, Lisp_Object args,
       insert1 (describe_key_maybe_fontify (kludge, prefix, keymap_p));
 
       /* Find all consecutive characters or rows that have the same
-        definition.  But, if VECTOR is a char-table, we had better
-        put a boundary between normal characters (-#x3FFF7F) and
-        8-bit characters (#x3FFF80-).  */
-      if (CHAR_TABLE_P (vector))
+        definition.  */
+      if (!CHAR_TABLE_P (vector))
        {
          while (i + 1 < stop
-                && (range_beg = i + 1, range_end = stop - 1,
-                  val = char_table_ref_and_range (vector, range_beg,
-                                                  &range_beg, &range_end),
-                  tem2 = get_keyelt (val, 0),
-                  !NILP (tem2))
+                && (tem2 = get_keyelt (AREF (vector, i + 1), 0),
+                    !NILP (tem2))
                 && !NILP (Fequal (tem2, definition)))
-           i = range_end;
+           i++;
        }
-      else
-       while (i + 1 < stop
-              && (tem2 = get_keyelt (AREF (vector, i + 1), 0),
-                  !NILP (tem2))
-              && !NILP (Fequal (tem2, definition)))
-         i++;
 
       /* Make sure found consecutive keys are either not shadowed or,
         if they are, that they are shadowed by the same command.  */
-      if (CHAR_TABLE_P (vector) && i != starting_i)
+      if (!NILP (Vdescribe_bindings_check_shadowing_in_ranges)
+         && CHAR_TABLE_P (vector) && i != starting_i
+         && (!EQ (Vdescribe_bindings_check_shadowing_in_ranges,
+                  Qignore_self_insert)
+             || !EQ (definition, Qself_insert_command)))
        {
          Lisp_Object key = make_nil_vector (1);
-         for (int j = starting_i + 1; j <= i; j++)
+         for (int j = range_beg + 1; j <= i; j++)
            {
              ASET (key, 0, make_fixnum (j));
              Lisp_Object tem = shadow_lookup (shadow, key, Qt, 0);
@@ -3181,6 +3180,24 @@ be preferred.  */);
   Vwhere_is_preferred_modifier = Qnil;
   where_is_preferred_modifier = 0;
 
+  DEFVAR_LISP ("describe-bindings-check-shadowing-in-ranges",
+              Vdescribe_bindings_check_shadowing_in_ranges,
+              doc: /* If non-nil, consider command shadowing when describing 
ranges of keys.
+If the value is t, describing bindings of consecutive keys will not
+report them as a single range if they are shadowed by different
+minor-mode commands.
+If the value is `ignore-self-insert', assume that consecutive keys
+bound to `self-insert-command' are not all shadowed; this speeds up
+commands such as \\[describe-bindings] and \\[describe-mode], but could miss 
some shadowing.
+Any other non-nil value is treated is t.
+
+Beware: setting this non-nil could potentially slow down commands
+that describe key bindings.  That is why the default is nil.  */);
+  Vdescribe_bindings_check_shadowing_in_ranges = Qnil;
+
+  DEFSYM (Qself_insert_command, "self-insert-command");
+  DEFSYM (Qignore_self_insert, "ignore-self-insert");
+
   DEFSYM (Qmenu_bar, "menu-bar");
   DEFSYM (Qmode_line, "mode-line");
 
diff --git a/src/lisp.h b/src/lisp.h
index 7bfc69b647..09e0b8e9bd 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -1555,6 +1555,14 @@ STRING_MULTIBYTE (Lisp_Object str)
 
 /* Convenience functions for dealing with Lisp strings.  */
 
+/* WARNING: Use the 'char *' pointers to string data with care in code
+   that could GC: GC can relocate string data, invalidating such
+   pointers.  It is best to use string character or byte index
+   instead, delaying the access through SDATA/SSDATA pointers to the
+   latest possible moment.  If you must use the 'char *' pointers
+   (e.g., for speed), be sure to adjust them after any call that could
+   potentially GC.  */
+
 INLINE unsigned char *
 SDATA (Lisp_Object string)
 {
@@ -1615,6 +1623,13 @@ STRING_SET_CHARS (Lisp_Object string, ptrdiff_t newsize)
   XSTRING (string)->u.s.size = newsize;
 }
 
+INLINE void
+CHECK_STRING_NULL_BYTES (Lisp_Object string)
+{
+  CHECK_TYPE (memchr (SSDATA (string), '\0', SBYTES (string)) == NULL,
+             Qfilenamep, string);
+}
+
 /* A regular vector is just a header plus an array of Lisp_Objects.  */
 
 struct Lisp_Vector
@@ -4113,7 +4128,6 @@ intern_c_string (const char *str)
 }
 
 /* Defined in eval.c.  */
-extern EMACS_INT minibuffer_quit_level;
 extern Lisp_Object Vautoload_queue;
 extern Lisp_Object Vrun_hooks;
 extern Lisp_Object Vsignaling_function;
diff --git a/src/lread.c b/src/lread.c
index a6c2db5d99..2abe2fd91a 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -192,7 +192,7 @@ static int readbyte_from_string (int, Lisp_Object);
    Qlambda, or a cons, we use this to keep an unread character because
    a file stream can't handle multibyte-char unreading.  The value -1
    means that there's no unread character.  */
-static int unread_char;
+static int unread_char = -1;
 
 static int
 readchar (Lisp_Object readcharfun, bool *multibyte)
@@ -1507,6 +1507,7 @@ Return t if the file exists and loads successfully.  */)
       input.stream = stream;
       input.lookahead = 0;
       infile = &input;
+      unread_char = -1;
     }
 
   if (! NILP (Vpurify_flag))
diff --git a/src/minibuf.c b/src/minibuf.c
index 0e7baf30dc..4b72d3e896 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -491,8 +491,13 @@ confirm the aborting of the current minibuffer and all 
contained ones.  */)
       array[1] = make_fixnum (minibuf_level - minibuf_depth + 1);
       if (!NILP (Fyes_or_no_p (Fformat (2, array))))
        {
-         minibuffer_quit_level = minibuf_depth;
-         Fthrow (Qexit, Qt);
+         /* Due to the above check, the current minibuffer is in the
+            most nested command loop, which means that we don't have
+            to abort any extra non-minibuffer recursive edits.  Thus,
+            the number of recursive edits we have to abort equals the
+            number of minibuffers we have to abort.  */
+         CALLN (Ffuncall, intern ("minibuffer-quit-recursive-edit"),
+                array[1]);
        }
     }
   else
@@ -1287,8 +1292,8 @@ Fifth arg HIST, if non-nil, specifies a history list and 
optionally
   HISTPOS is the initial position for use by the minibuffer history
   commands.  For consistency, you should also specify that element of
   the history as the value of INITIAL-CONTENTS.  Positions are counted
-  starting from 1 at the beginning of the list.  If HIST is the symbol
-  `t', history is not recorded.
+  starting from 1 at the beginning of the list.  If HIST is t, history
+  is not recorded.
 
   If `history-add-new-input' is non-nil (the default), the result will
   be added to the history list using `add-to-history'.
@@ -2032,8 +2037,7 @@ HIST, if non-nil, specifies a history list and optionally 
the initial
   (This is the only case in which you should use INITIAL-INPUT instead
   of DEF.)  Positions are counted starting from 1 at the beginning of
   the list.  The variable `history-length' controls the maximum length
-  of a history list.  If HIST is the symbol `t', history is not
-  recorded.
+  of a history list.  If HIST is t, history is not recorded.
 
 DEF, if non-nil, is the default value or the list of default values.
 
@@ -2481,7 +2485,7 @@ is added with
   (set minibuffer-history-variable
        (cons STRING (symbol-value minibuffer-history-variable)))
 
- If the variable is the symbol `t', no history is recorded.  */);
+ If the variable is t, no history is recorded.  */);
   XSETFASTINT (Vminibuffer_history_variable, 0);
 
   DEFVAR_LISP ("minibuffer-history-position", Vminibuffer_history_position,
diff --git a/src/process.c b/src/process.c
index bfca165fca..58347a154a 100644
--- a/src/process.c
+++ b/src/process.c
@@ -6887,7 +6887,7 @@ If CURRENT-GROUP is `lambda', and if the shell owns the 
terminal,
 don't send the signal.
 
 This function calls the functions of `interrupt-process-functions' in
-the order of the list, until one of them returns non-`nil'.  */)
+the order of the list, until one of them returns non-nil.  */)
   (Lisp_Object process, Lisp_Object current_group)
 {
   return CALLN (Frun_hook_with_args_until_success, 
Qinterrupt_process_functions,
@@ -8514,7 +8514,7 @@ thus favoring processes with lower descriptors.  */);
               doc: /* List of functions to be called for `interrupt-process'.
 The arguments of the functions are the same as for `interrupt-process'.
 These functions are called in the order of the list, until one of them
-returns non-`nil'.  */);
+returns non-nil.  */);
   Vinterrupt_process_functions = list1 (Qinternal_default_interrupt_process);
 
   DEFVAR_LISP ("internal--daemon-sockname", Vinternal__daemon_sockname,
diff --git a/src/search.c b/src/search.c
index 14adeb58e9..08f1e9474f 100644
--- a/src/search.c
+++ b/src/search.c
@@ -2387,6 +2387,13 @@ since only regular expressions have distinguished 
subexpressions.  */)
   if (! NILP (string))
     CHECK_STRING (string);
 
+  /* Most replacement texts don't contain any backslash directives in
+     the replacements.  Check whether that's the case, which will
+     enable us to take the fast path later.  */
+  if (NILP (literal)
+      && !memchr (SSDATA (newtext), '\\', SBYTES (newtext)))
+    literal = Qt;
+
   case_action = nochange;      /* We tried an initialization */
                                /* but some C compilers blew it */
 
diff --git a/src/xdisp.c b/src/xdisp.c
index 2e72f6b591..b777d1b282 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4288,12 +4288,17 @@ handle_fontified_prop (struct it *it)
       struct buffer *obuf = current_buffer;
       ptrdiff_t begv = BEGV, zv = ZV;
       bool old_clip_changed = current_buffer->clip_changed;
+      bool saved_inhibit_flag = it->f->inhibit_clear_image_cache;
 
       val = Vfontification_functions;
       specbind (Qfontification_functions, Qnil);
 
       eassert (it->end_charpos == ZV);
 
+      /* Don't allow Lisp that runs from 'fontification-functions'
+        clear our face and image caches behind our back.  */
+      it->f->inhibit_clear_image_cache = true;
+
       if (!CONSP (val) || EQ (XCAR (val), Qlambda))
        safe_call1 (val, pos);
       else
@@ -4327,6 +4332,7 @@ handle_fontified_prop (struct it *it)
            }
        }
 
+      it->f->inhibit_clear_image_cache = saved_inhibit_flag;
       unbind_to (count, Qnil);
 
       /* Fontification functions routinely call `save-restriction'.
diff --git a/src/xfaces.c b/src/xfaces.c
index aefed54ebc..5e63e87d75 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -2420,11 +2420,11 @@ evaluate_face_filter (Lisp_Object filter, struct window 
*w,
 /* Determine whether FACE_REF is a "filter" face specification (case
    #4 in merge_face_ref).  If it is, evaluate the filter, and if the
    filter matches, return the filtered face spec.  If the filter does
-   not match, return `nil'.  If FACE_REF is not a filtered face
+   not match, return nil.  If FACE_REF is not a filtered face
    specification, return FACE_REF.
 
    On error, set *OK to false, having logged an error message if
-   ERR_MSGS is true, and return `nil'.  Otherwise, *OK is not touched.
+   ERR_MSGS is true, and return nil.  Otherwise, *OK is not touched.
 
    W is either NULL or a window used to evaluate filters.  If W is
    NULL, no window-based face specification filter matches.
@@ -2709,7 +2709,7 @@ merge_face_ref (struct window *w,
                {
                  if (EQ (value, Qt))
                    value = make_fixnum (1);
-                 if (FIXNUMP (value)
+                 if ((FIXNUMP (value) && XFIXNUM (value) != 0)
                      || STRINGP (value)
                      || CONSP (value)
                      || NILP (value))
diff --git a/test/infra/Dockerfile.emba b/test/infra/Dockerfile.emba
index 0b61c74aef..e79f370f17 100644
--- a/test/infra/Dockerfile.emba
+++ b/test/infra/Dockerfile.emba
@@ -41,7 +41,8 @@ COPY . /checkout
 WORKDIR /checkout
 RUN ./autogen.sh autoconf
 RUN ./configure
-RUN make -j4 bootstrap
+# 'make -j4 bootstrap' does not work reliably.
+RUN make bootstrap
 RUN make -j4
 
 FROM emacs-base as emacs-filenotify-gio
@@ -55,7 +56,7 @@ COPY . /checkout
 WORKDIR /checkout
 RUN ./autogen.sh autoconf
 RUN ./configure --with-file-notification=gfile
-RUN make -j4 bootstrap
+RUN make bootstrap
 RUN make -j4
 
 FROM emacs-base as emacs-gnustep
diff --git a/test/infra/gitlab-ci.yml b/test/infra/gitlab-ci.yml
index 5082b08e01..0b12f96f4c 100644
--- a/test/infra/gitlab-ci.yml
+++ b/test/infra/gitlab-ci.yml
@@ -200,7 +200,7 @@ default:
 stages:
   - prep-images
   - build-images
-  - fast
+#  - fast
   - normal
   - platform-images
   - platforms
@@ -221,12 +221,12 @@ build-image-inotify:
   variables:
     target: emacs-inotify
 
-test-fast-inotify:
-  stage: fast
-  extends: [.job-template, .test-template]
-  variables:
-    target: emacs-inotify
-    make_params: "-C test check"
+# test-fast-inotify:
+#   stage: fast
+#   extends: [.job-template, .test-template]
+#   variables:
+#     target: emacs-inotify
+#     make_params: "-C test check"
 
 test-lisp-inotify:
   stage: normal
diff --git a/test/lisp/auth-source-tests.el b/test/lisp/auth-source-tests.el
index 45482e916e..5140970b0b 100644
--- a/test/lisp/auth-source-tests.el
+++ b/test/lisp/auth-source-tests.el
@@ -312,39 +312,105 @@
   ;; Emacs process.  Therefore, we don't care to delete it.
   (let ((auth-sources '((:source (:secrets "session"))))
         (auth-source-save-behavior t)
-        (host (md5 (concat (prin1-to-string process-environment)
-                          (current-time-string))))
-        (passwd (md5 (concat (prin1-to-string process-environment)
-                            (current-time-string) (current-time-string))))
-        auth-info auth-passwd)
-    ;; Redefine `read-*' in order to avoid interactive input.
-    (cl-letf (((symbol-function 'read-passwd) (lambda (_) passwd))
-              ((symbol-function 'read-string)
-               (lambda (_prompt &optional _initial _history default
-                                _inherit-input-method)
-                 default)))
-      (setq auth-info
-            (car (auth-source-search
-                  :max 1 :host host :require '(:user :secret) :create t))))
-    (should (functionp (plist-get auth-info :save-function)))
-    (funcall (plist-get auth-info :save-function))
-
-    ;; Check, that the item has been created indeed.
-    (auth-source-forget+ :host t)
-    (setq auth-info (car (auth-source-search :host host))
-         auth-passwd (plist-get auth-info :secret)
-         auth-passwd (if (functionp auth-passwd)
-                         (funcall auth-passwd)
-                       auth-passwd))
-    (should (string-equal (plist-get auth-info :user) (user-login-name)))
-    (should (string-equal (plist-get auth-info :host) host))
-    (should (string-equal auth-passwd passwd))
-
-    ;; Cleanup.
-    ;; Should use `auth-source-delete' when implemented for :secrets backend.
-    (secrets-delete-item
-     "session"
-     (format "%s@%s" (plist-get auth-info :user) (plist-get auth-info 
:host)))))
+        host auth-info auth-passwd)
+    (dolist (passwd '("foo" "" nil))
+      (unwind-protect
+          ;; Redefine `read-*' in order to avoid interactive input.
+          (cl-letf (((symbol-function 'read-passwd) (lambda (_) passwd))
+                    ((symbol-function 'read-string)
+                     (lambda (_prompt &optional _initial _history default
+                                      _inherit-input-method)
+                       default)))
+            (setq host
+                  (md5 (concat (prin1-to-string process-environment) passwd))
+                  auth-info
+                  (car (auth-source-search
+                        :max 1 :host host :require '(:user :secret) :create t))
+                 auth-passwd (plist-get auth-info :secret)
+                 auth-passwd (if (functionp auth-passwd)
+                                 (funcall auth-passwd)
+                               auth-passwd))
+            (should (string-equal (plist-get auth-info :user) 
(user-login-name)))
+            (should (string-equal (plist-get auth-info :host) host))
+            (should (equal auth-passwd passwd))
+            (when (functionp (plist-get auth-info :save-function))
+              (funcall (plist-get auth-info :save-function)))
+
+            ;; Check, that the item has been created indeed.
+            (auth-source-forget+ :host t)
+            (setq auth-info (car (auth-source-search :host host))
+                 auth-passwd (plist-get auth-info :secret)
+                 auth-passwd (if (functionp auth-passwd)
+                                 (funcall auth-passwd)
+                               auth-passwd))
+            (if (zerop (length passwd))
+                (progn
+                  (should-not (plist-get auth-info :user))
+                  (should-not (plist-get auth-info :host))
+                  (should-not auth-passwd))
+              (should
+               (string-equal (plist-get auth-info :user) (user-login-name)))
+              (should (string-equal (plist-get auth-info :host) host))
+              (should (string-equal auth-passwd passwd)))))
+
+      ;; Cleanup.
+      ;; Should use `auth-source-delete' when implemented for :secrets backend.
+      (secrets-delete-item
+       "session"
+       (format "%s@%s" (plist-get auth-info :user) (plist-get auth-info 
:host))))))
+
+(ert-deftest auth-source-test-netrc-create-secret ()
+  (let* ((netrc-file (make-temp-file "auth-source-test"))
+         (auth-sources (list netrc-file))
+         (auth-source-save-behavior t)
+         host auth-info auth-passwd)
+    (unwind-protect
+        (dolist (passwd '("foo" "" nil))
+          ;; Redefine `read-*' in order to avoid interactive input.
+          (cl-letf (((symbol-function 'read-passwd) (lambda (_) passwd))
+                    ((symbol-function 'read-string)
+                     (lambda (_prompt &optional _initial _history default
+                                      _inherit-input-method)
+                       default)))
+            (setq host
+                  (md5 (concat (prin1-to-string process-environment) passwd))
+                  auth-info
+                  (car (auth-source-search
+                        :max 1 :host host :require '(:user :secret) :create t))
+                 auth-passwd (plist-get auth-info :secret)
+                 auth-passwd (if (functionp auth-passwd)
+                                 (funcall auth-passwd)
+                               auth-passwd))
+            (should (string-equal (plist-get auth-info :user) 
(user-login-name)))
+            (should (string-equal (plist-get auth-info :host) host))
+            (should (equal auth-passwd passwd))
+            (when (functionp (plist-get auth-info :save-function))
+              (funcall (plist-get auth-info :save-function)))
+
+            ;; Check, that the item has been created indeed.
+            (auth-source-forget+ :host t)
+            (setq auth-source-netrc-cache nil)
+            (setq auth-info (car (auth-source-search :host host))
+                 auth-passwd (plist-get auth-info :secret)
+                 auth-passwd (if (functionp auth-passwd)
+                                 (funcall auth-passwd)
+                               auth-passwd))
+            (with-temp-buffer
+              (insert-file-contents netrc-file)
+              (if (zerop (length passwd))
+                  (progn
+                    (should-not (plist-get auth-info :user))
+                    (should-not (plist-get auth-info :host))
+                    (should-not auth-passwd)
+                    (should-not (search-forward host nil 'noerror)))
+                (should
+                 (string-equal (plist-get auth-info :user) (user-login-name)))
+                (should (string-equal (plist-get auth-info :host) host))
+                (should (string-equal auth-passwd passwd))
+                (should (search-forward host nil 'noerror))))))
+
+      ;; Cleanup.
+      (delete-file netrc-file))))
 
 (ert-deftest auth-source-delete ()
   (let* ((netrc-file (make-temp-file "auth-source-test" nil nil "\
diff --git a/test/lisp/button-tests.el b/test/lisp/button-tests.el
index e0944afa34..2f5ad795df 100644
--- a/test/lisp/button-tests.el
+++ b/test/lisp/button-tests.el
@@ -59,6 +59,7 @@
   "Test `button--help-echo' with forms."
   (with-temp-buffer
     ;; Test text property buttons with dynamic scoping.
+    (setq lexical-binding nil)
     (let* ((help   (make-symbol "help"))
            (form   `(funcall (let ((,help "lexical form"))
                                (lambda () ,help))))
diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el
index 666de89c53..46bcbfce30 100644
--- a/test/lisp/electric-tests.el
+++ b/test/lisp/electric-tests.el
@@ -35,7 +35,8 @@
 (defun call-with-saved-electric-modes (fn)
   (let ((saved-electric (if electric-pair-mode 1 -1))
         (saved-layout (if electric-layout-mode 1 -1))
-        (saved-indent (if electric-indent-mode 1 -1)))
+        (saved-indent (if electric-indent-mode 1 -1))
+        (blink-paren-function nil))
     (electric-pair-mode -1)
     (electric-layout-mode -1)
     (electric-indent-mode -1)
@@ -173,7 +174,7 @@ The buffer's contents should %s:
           expected-string
           expected-point
           bindings
-          (modes '(quote (ruby-mode js-mode)))
+          (modes '(quote (ruby-mode js-mode python-mode)))
           (test-in-comments t)
           (test-in-strings t)
           (test-in-code t)
@@ -296,7 +297,7 @@ The buffer's contents should %s:
 ;;; Quotes
 ;;;
 (define-electric-pair-test pair-some-quotes-skip-others
-  " \"\"      " "-\"\"-----" :skip-pair-string "-ps------"
+  " \"\"      " "-\"\"-\"---" :skip-pair-string "-ps-p----"
   :test-in-strings nil
   :bindings `((electric-pair-text-syntax-table
                . ,prog-mode-syntax-table)))
diff --git a/test/lisp/emacs-lisp/checkdoc-tests.el 
b/test/lisp/emacs-lisp/checkdoc-tests.el
index a4b252031f..3eb7da3d4a 100644
--- a/test/lisp/emacs-lisp/checkdoc-tests.el
+++ b/test/lisp/emacs-lisp/checkdoc-tests.el
@@ -146,4 +146,34 @@ See the comments in Bug#24998."
     (re-search-forward "e.g")
     (should (checkdoc-in-abbreviation-p (point)))))
 
+(ert-deftest checkdoc-tests-fix-y-or-n-p ()
+  (with-temp-buffer
+    (emacs-lisp-mode)
+    (let ((standard-output (current-buffer))
+          (checkdoc-autofix-flag 'automatic))
+      (prin1 '(y-or-n-p "foo"))         ; "foo"
+      (goto-char (length "(y-or-n-p "))
+      (checkdoc--fix-y-or-n-p)
+      (should (equal (buffer-string) "(y-or-n-p \"foo?\")")))))
+
+(ert-deftest checkdoc-tests-fix-y-or-n-p/no-change ()
+  (with-temp-buffer
+    (emacs-lisp-mode)
+    (let ((standard-output (current-buffer))
+          (checkdoc-autofix-flag 'automatic))
+      (prin1 '(y-or-n-p "foo?"))        ; "foo?"
+      (goto-char (length "(y-or-n-p "))
+      (checkdoc--fix-y-or-n-p)
+      (should (equal (buffer-string) "(y-or-n-p \"foo?\")")))))
+
+(ert-deftest checkdoc-tests-fix-y-or-n-p/with-space ()
+  (with-temp-buffer
+    (emacs-lisp-mode)
+    (let ((standard-output (current-buffer))
+          (checkdoc-autofix-flag 'automatic))
+      (prin1 '(y-or-n-p "foo? "))       ; "foo? "
+      (goto-char (length "(y-or-n-p "))
+      (checkdoc--fix-y-or-n-p)
+      (should (equal (buffer-string) "(y-or-n-p \"foo? \")")))))
+
 ;;; checkdoc-tests.el ends here
diff --git a/test/lisp/emacs-lisp/map-tests.el 
b/test/lisp/emacs-lisp/map-tests.el
index c0f0dbc92b..afade8e295 100644
--- a/test/lisp/emacs-lisp/map-tests.el
+++ b/test/lisp/emacs-lisp/map-tests.el
@@ -85,11 +85,13 @@ Evaluate BODY for each created map."
     (should (= 5 (map-elt map 0 5)))))
 
 (ert-deftest test-map-elt-testfn ()
-  (let ((map (list (cons "a" 1) (cons "b" 2)))
-        ;; Make sure to use a non-eq "a", even when compiled.
-        (noneq-key (string ?a)))
-    (should-not (map-elt map noneq-key))
-    (should (map-elt map noneq-key nil #'equal))))
+  (let* ((a (string ?a))
+         (map `((,a . 0) (,(string ?b) . 1))))
+    (should (= (map-elt map a) 0))
+    (should (= (map-elt map "a") 0))
+    (should (= (map-elt map (string ?a)) 0))
+    (should (= (map-elt map "b") 1))
+    (should (= (map-elt map (string ?b)) 1))))
 
 (ert-deftest test-map-elt-with-nil-value ()
   (should-not (map-elt '((a . 1) (b)) 'b 2)))
@@ -129,6 +131,19 @@ Evaluate BODY for each created map."
         (setf (map-elt map size) 'v)
         (should (eq (map-elt map size) 'v))))))
 
+(ert-deftest test-map-put!-alist ()
+  "Test `map-put!' test function on alists."
+  (let ((key (string ?a))
+        (val 0)
+        map)
+    (should-error (map-put! map key val) :type 'map-not-inplace)
+    (setq map (list (cons key val)))
+    (map-put! map key (1- val))
+    (should (equal map '(("a" . -1))))
+    (map-put! map (string ?a) (1+ val))
+    (should (equal map '(("a" . 1))))
+    (should-error (map-put! map (string ?a) val #'eq) :type 'map-not-inplace)))
+
 (ert-deftest test-map-put-alist-new-key ()
   "Regression test for Bug#23105."
   (let ((alist (list (cons 0 'a))))
@@ -197,6 +212,15 @@ Evaluate BODY for each created map."
   (with-empty-maps-do map
     (should (eq map (map-delete map t)))))
 
+(ert-deftest test-map-delete-alist ()
+  "Test `map-delete' test function on alists."
+  (let* ((a (string ?a))
+         (map `((,a) (,(string ?b)))))
+    (setq map (map-delete map a))
+    (should (equal map '(("b"))))
+    (setq map (map-delete map (string ?b)))
+    (should-not map)))
+
 (ert-deftest test-map-nested-elt ()
   (let ((vec [a b [c d [e f]]]))
     (should (eq (map-nested-elt vec '(2 2 0)) 'e)))
diff --git a/test/lisp/emacs-lisp/subr-x-tests.el 
b/test/lisp/emacs-lisp/subr-x-tests.el
index ef04cde386..1d19496ba4 100644
--- a/test/lisp/emacs-lisp/subr-x-tests.el
+++ b/test/lisp/emacs-lisp/subr-x-tests.el
@@ -455,18 +455,18 @@
   "Test `thread-first' wraps single function names."
   (should (equal (macroexpand
                   '(thread-first 5
-                     -))
+                                 -))
                  '(- 5)))
   (should (equal (macroexpand
                   '(thread-first (+ 1 2)
-                     -))
+                                 -))
                  '(- (+ 1 2)))))
 
 (ert-deftest subr-x-test-thread-first-expansion ()
   "Test `thread-first' expands correctly."
   (should (equal
            (macroexpand '(thread-first
-                             5
+                           5
                            (+ 20)
                            (/ 25)
                            -
@@ -477,13 +477,13 @@
   "Test several `thread-first' examples."
   (should (equal (thread-first (+ 40 2)) 42))
   (should (equal (thread-first
-                     5
+                   5
                    (+ 20)
                    (/ 25)
                    -
                    (+ 40)) 39))
   (should (equal (thread-first
-                     "this-is-a-string"
+                   "this-is-a-string"
                    (split-string "-")
                    (nbutlast 2)
                    (append (list "good")))
@@ -500,18 +500,18 @@
   "Test `thread-last' wraps single function names."
   (should (equal (macroexpand
                   '(thread-last 5
-                     -))
+                                -))
                  '(- 5)))
   (should (equal (macroexpand
                   '(thread-last (+ 1 2)
-                     -))
+                                -))
                  '(- (+ 1 2)))))
 
 (ert-deftest subr-x-test-thread-last-expansion ()
   "Test `thread-last' expands correctly."
   (should (equal
            (macroexpand '(thread-last
-                             5
+                           5
                            (+ 20)
                            (/ 25)
                            -
@@ -522,13 +522,13 @@
   "Test several `thread-last' examples."
   (should (equal (thread-last (+ 40 2)) 42))
   (should (equal (thread-last
-                     5
+                   5
                    (+ 20)
                    (/ 25)
                    -
                    (+ 40)) 39))
   (should (equal (thread-last
-                     (list 1 -2 3 -4 5)
+                   (list 1 -2 3 -4 5)
                    (mapcar #'abs)
                    (cl-reduce #'+)
                    (format "abs sum is: %s"))
diff --git a/test/lisp/emacs-lisp/tabulated-list-test.el 
b/test/lisp/emacs-lisp/tabulated-list-test.el
index db1ce31258..679afda394 100644
--- a/test/lisp/emacs-lisp/tabulated-list-test.el
+++ b/test/lisp/emacs-lisp/tabulated-list-test.el
@@ -96,7 +96,7 @@
      (should (equal (get-text-property (point) 'tabulated-list-column-name)
                     "name-2"))
      (tabulated-list-sort)
-     ;; Check a `t' as the sorting predicate.
+     ;; Check a t as the sorting predicate.
      (should (string= text (buffer-substring-no-properties (point-min) 
(point-max))))
      ;; Invert.
      (tabulated-list-sort 1)
diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el
index aa5150b4b7..b283a512a4 100644
--- a/test/lisp/files-tests.el
+++ b/test/lisp/files-tests.el
@@ -154,12 +154,14 @@ form.")
 (ert-deftest files-tests-permanent-local-variables ()
   (let ((enable-local-variables nil))
     (with-temp-buffer
+      (setq lexical-binding nil)
       (insert ";;; test-test.el --- tests  -*- lexical-binding: t; -*-\n\n")
       (hack-local-variables)
       (should (eq lexical-binding t))))
   (let ((enable-local-variables nil)
         (permanently-enabled-local-variables nil))
     (with-temp-buffer
+      (setq lexical-binding nil)
       (insert ";;; test-test.el --- tests  -*- lexical-binding: t; -*-\n\n")
       (hack-local-variables)
       (should (eq lexical-binding nil)))))
diff --git a/test/lisp/mh-e/mh-xface-tests.el b/test/lisp/mh-e/mh-limit-tests.el
similarity index 50%
copy from test/lisp/mh-e/mh-xface-tests.el
copy to test/lisp/mh-e/mh-limit-tests.el
index 65e3c82ec0..982573d9b4 100644
--- a/test/lisp/mh-e/mh-xface-tests.el
+++ b/test/lisp/mh-e/mh-limit-tests.el
@@ -1,4 +1,4 @@
-;;; mh-xface-tests.el --- tests for mh-xface.el -*- lexical-binding: t -*-
+;;; mh-limit-tests.el --- tests for mh-limit.el -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2021 Free Software Foundation, Inc.
 
@@ -20,16 +20,16 @@
 ;;; Code:
 
 (require 'ert)
-(require 'mh-xface)
-
-(ert-deftest mh-x-image-url-sane-p ()
-  "Test that `mh-x-image-url-sane-p' accepts a URL exactly if it is sane."
-  (should (equal (mh-x-image-url-sane-p (concat "http://";
-                                                (make-string 101 ?a)))
-                 nil))                  ;too long
-  (should (equal (mh-x-image-url-sane-p "http") nil)) ;too short
-  (should (equal (mh-x-image-url-sane-p "http:") t))
-  (should (equal (mh-x-image-url-sane-p "https") nil)) ;too short
-  (should (equal (mh-x-image-url-sane-p "https:") t))
-  (should (equal (mh-x-image-url-sane-p "https://www.example.com/me.png";) t))
-  (should (equal (mh-x-image-url-sane-p "abcde:") nil)))
+(require 'mh-limit)
+
+(ert-deftest mh-pick-args-list ()
+  "Test `mh-pick-args-list'."
+  (should (equal '() (mh-pick-args-list "")))
+  (should (equal '("-subject" "a") (mh-pick-args-list "-subject a")))
+  (should (equal '("-subject" "a") (mh-pick-args-list "  -subject   a  ")))
+  (should (equal '("-subject" "a" "-from" "b")
+                 (mh-pick-args-list "-subject a -from b")))
+  (should (equal '("-subject" "a b" "-from" "c d")
+                 (mh-pick-args-list "-subject a b -from c d"))))
+
+;;; mh-limit-tests.el ends here
diff --git a/test/lisp/mh-e/mh-utils-tests.el b/test/lisp/mh-e/mh-utils-tests.el
new file mode 100644
index 0000000000..68152ce3b6
--- /dev/null
+++ b/test/lisp/mh-e/mh-utils-tests.el
@@ -0,0 +1,408 @@
+;;; mh-utils-tests.el --- tests for mh-utils.el -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(require 'ert)
+(eval-when-compile (require 'cl-lib))
+(require 'mh-utils)
+
+(ert-deftest mh-quote-pick-expr ()
+  "Test `mh-quote-pick-expr'."
+  (should (equal nil (mh-quote-pick-expr nil)))
+  (should (equal '() (mh-quote-pick-expr '())))
+  (should (equal '("foo") (mh-quote-pick-expr '("foo"))))
+  (should (equal '("^\\[foo]?\\*+\\.\\$")
+                 (mh-quote-pick-expr '("^[foo]?*+.$"))))
+  (should (equal '("^\\[foo]?\\*+\\.\\$" "bar" "baz\\$")
+                 (mh-quote-pick-expr '("^[foo]?*+.$" "bar" "baz$")))))
+
+(ert-deftest mh-normalize-folder-name ()
+  "Test `mh-normalize-folder-name'."
+  (should (equal nil (mh-normalize-folder-name nil)))
+  (should (equal "+" (mh-normalize-folder-name "")))
+  (should (equal "" (mh-normalize-folder-name "" t)))
+  (should (equal nil (mh-normalize-folder-name "" nil nil t)))
+  (should (equal nil (mh-normalize-folder-name "+" nil nil t)))
+  (should (equal nil (mh-normalize-folder-name "+" t t t)))
+  (should (equal "+inbox" (mh-normalize-folder-name "inbox")))
+  (should (equal "+inbox" (mh-normalize-folder-name "+inbox")))
+  (should (equal "+inbox" (mh-normalize-folder-name "+inbox/")))
+  (should (equal "+inbox/" (mh-normalize-folder-name "+inbox/" t t t)))
+  (should (equal "+inbox/" (mh-normalize-folder-name "+inbox/" nil t)))
+  (should (equal "+news" (mh-normalize-folder-name "+inbox////../news")))
+  (should (equal "+news" (mh-normalize-folder-name "+inbox////../news/")))
+  (should (equal "+news/"
+                 (mh-normalize-folder-name "+inbox////../news/" nil t)))
+  (should (equal "+inbox/news" (mh-normalize-folder-name "+inbox////./news"))))
+
+
+;; Folder names that are used by the following tests.
+(defvar mh-test-rel-folder "rela-folder")
+(defvar mh-test-abs-folder "/abso-folder")
+(defvar mh-test-no-such-folder "/testdir/none"
+  "Name of a folder that the user does not have.")
+
+(defvar mh-test-variant-logged-already nil
+  "Whether `with-mh-test-env' has written the MH variant to the log.")
+(setq mh-test-variant-logged-already nil) ;reset if buffer is re-evaluated
+
+(defvar mh-test-utils-debug-mocks nil
+  "Whether to log detailed behavior of mock functions.")
+
+(defvar mh-test-call-process-real (symbol-function 'call-process))
+(defvar mh-test-file-directory-p-real (symbol-function 'file-directory-p))
+
+
+;;; This macro wraps tests that touch the file system and/or run programs.
+;;; When running such tests, MH-E can use a particular MH variant
+;;; installed on the system, or it can use the mocks provided below.
+
+;;; By setting PATH and mh-sys-path, you can select which of the
+;;; installed MH variants to use or ignore them all and use mocks.
+
+(defmacro with-mh-test-env (&rest body)
+  "Evaluate BODY with a test mail environment.
+Functions that touch the file system or run MH programs are either
+mocked out or pointed at a test tree.  When called from Emacs's batch
+testing infrastructure, this will use mocks and thus run on systems
+that do not have any MH variant installed.  MH-E developers can
+install an MH variant and test it interactively."
+  (declare (indent defun))
+  `(cl-letf ((temp-home-dir nil)
+             ;; make local bindings for things we will modify for test env
+             (mh-user-path)
+             (mh-test-abs-folder)
+             ((symbol-function 'call-process))
+             ((symbol-function 'file-directory-p))
+             ;; the test always gets its own sub-folders cache
+             (mh-sub-folders-cache (make-hash-table :test #'equal))
+             ;; remember the original value
+             (original-mh-envvar (getenv "MH")))
+     (unless mh-test-variant-logged-already
+       (mh-variant-set mh-variant)
+       (setq mh-test-variant-logged-already t))
+     (unwind-protect
+         (progn
+           (if mh-variant-in-use
+               (setq temp-home-dir (mh-test-utils-setup-with-variant))
+             (mh-test-utils-setup-with-mocks))
+           ,@body)
+       (if temp-home-dir (delete-directory temp-home-dir t))
+       (setenv "MH" original-mh-envvar))))
+
+(defun mh-test-utils-setup-with-mocks ()
+  "Set dynamically bound variables so that MH programs are mocked out.
+The tests use this method if no configured MH variant is found."
+  (setq mh-user-path "/testdir/Mail/")
+  (mh-populate-sub-folders-cache "+")
+  (mh-populate-sub-folders-cache "+rela-folder")
+  (mh-populate-sub-folders-cache "+rela-folder/bar")
+  (mh-populate-sub-folders-cache "+rela-folder/foo")
+  (mh-populate-sub-folders-cache "+rela-folder/food")
+  (fset 'call-process #'mh-test-utils-mock-call-process)
+  (fset 'file-directory-p #'mh-test-utils-mock-file-directory-p))
+
+(defun mh-test-utils-mock-call-process (program
+                                        &optional _infile _destination _display
+                                        &rest args)
+  "A mocked version of `call-process' that calls no processes."
+  (let ((argument-responses
+         ;; assoc list of program arguments and lines to output.
+         '((("folder" "-fast") . ("rela-folder"))
+           (("folders" "-noheader" "-norecurse" "-nototal") .
+            ("rela-folder  has no messages."))
+           (("folders" "-noheader" "-norecurse" "-nototal" "+rela-folder") .
+            ("rela-folder+      has no messages."
+             "rela-folder/bar   has no messages."
+             "rela-folder/foo   has no messages."
+             "rela-folder/food  has no messages."))
+           (("folders" "-noheader" "-norecurse" "-nototal" "+rela-folder/foo") 
.
+            ("rela-folder/foo+ has no messages."))
+           (("folders" "-noheader" "-norecurse" "-nototal" "+") .
+            ("+ has no messages."))
+           (("folders" "-noheader" "-norecurse" "-nototal" "+/abso-folder") .
+            ("/abso-folder+      has no messages."
+             "/abso-folder/bar   has no messages."
+             "/abso-folder/foo   has no messages."
+             "/abso-folder/food  has no messages."))
+           ))
+        (arglist (cons (file-name-base program) args)))
+    (let ((response-list-cons (assoc arglist argument-responses)))
+      (cond (response-list-cons
+             (let ((response-list (cdr response-list-cons)))
+               (when mh-test-utils-debug-mocks
+                 (message "call-process mock arglist %s" arglist)
+                 (message " -> response %S" response-list))
+               (while response-list
+                 (insert (car response-list) "\n")
+                 (setq response-list (cdr response-list))))
+             0)
+            (t
+             (message "call-process mock unexpected arglist %s" arglist)
+             1)))))
+
+(defun mh-test-utils-mock-file-directory-p (filename)
+  "A mocked version of `file-directory-p' that does not access the file 
system."
+  (let ((directories '("" "/" "/tmp" "/abso-folder" "/abso-folder/foo"
+                       "/testdir/Mail" "/testdir/Mail/rela-folder"
+                       "/testdir/Mail/rela-folder/foo"
+                       "rela-folder" "rela-folder/foo"))
+        (non-directories '("/abso-folder/fo" "rela-folder/fo"
+                           "/testdir/Mail/rela-folder/fo"
+                           "/testdir/Mail/nosuchfolder"
+                           "/nosuchfolder" "nosuchfolder")))
+    (cond ((member (directory-file-name filename) directories)
+           (when mh-test-utils-debug-mocks
+             (message "file-directory-p mock: %S -> t" filename))
+           t)
+          ((member (directory-file-name filename) non-directories)
+           (when mh-test-utils-debug-mocks
+             (message "file-directory-p mock: %S -> nil" filename))
+           nil)
+          (t
+           (message "file-directory-p mock unexpected filename: %S" filename)
+           nil))))
+
+(defun mh-test-utils-setup-with-variant ()
+  "Create a temporary directory structure for actual MH programs to read.
+Return the name of the root of the created directory tree.
+Set dynamically bound variables so that MH programs may log.
+The tests use this method if a configured MH variant is found."
+  (let* ((temp-home-dir
+          (make-temp-file "emacs-mh-e-unit-test" t))
+         (profile (expand-file-name
+                   ".mh_profile" temp-home-dir))
+         (mail-dir (expand-file-name "Mail" temp-home-dir))
+         (rela-folder (expand-file-name
+                       "rela-folder" mail-dir))
+         (abso-folder (expand-file-name
+                       "abso-folder" temp-home-dir)))
+    (with-temp-file profile
+      (insert "Path: " mail-dir "\n" "Welcome: disable\n"))
+    (setenv "MH" profile)
+    (make-directory (expand-file-name "bar" rela-folder) t)
+    (make-directory (expand-file-name "foo" rela-folder) t)
+    (make-directory (expand-file-name "food" rela-folder) t)
+    (setq mh-user-path (file-name-as-directory mail-dir))
+    (make-directory (expand-file-name "bar" abso-folder) t)
+    (make-directory (expand-file-name "foo" abso-folder) t)
+    (make-directory (expand-file-name "food" abso-folder) t)
+    (setq mh-test-abs-folder abso-folder)
+    (fset 'call-process #'mh-test-utils-log-call-process)
+    (fset 'file-directory-p #'mh-test-utils-log-file-directory-p)
+    temp-home-dir))
+
+(defun mh-test-utils-log-call-process (program
+                                       &optional infile destination display
+                                       &rest args)
+  "A wrapper around `call-process' that can log the program args and output.
+Both args and output are written with `message' if `mh-test-utils-debug-mocks'
+is non-nil."
+  (let (process-output)
+    (when mh-test-utils-debug-mocks
+      (message "call-process arglist %s" (cons program args)))
+    (with-temp-buffer
+      (apply mh-test-call-process-real program infile destination display args)
+      (setq process-output (buffer-string)))
+    (when mh-test-utils-debug-mocks
+      (message " -> response:\n%s" process-output))
+    (insert process-output)))
+
+(defun mh-test-utils-log-file-directory-p (filename)
+  "A wrapper around `file-directory-p' that can log calls.
+Both FILENAME and the return value are written with `message'
+if `mh-test-utils-debug-mocks' is non-nil."
+  (let ((result (funcall mh-test-file-directory-p-real filename)))
+    (when mh-test-utils-debug-mocks
+      (message "file-directory-p: %S -> %s" filename result))
+    result))
+
+
+(ert-deftest mh-sub-folders-actual ()
+  "Test `mh-sub-folders-actual'."
+  ;; Note that mh-sub-folders-actual expects the folder to have
+  ;; already been normalized with
+  ;; (mh-normalize-folder-name folder nil nil t)
+  (with-mh-test-env
+    (should (equal
+             mh-test-rel-folder
+             (car (assoc mh-test-rel-folder (mh-sub-folders-actual nil)))))
+    ;; Empty string and "+" not tested since mh-normalize-folder-name
+    ;; would change them to nil.
+    (should (equal "foo"
+                   (car (assoc "foo" (mh-sub-folders-actual
+                                      (format "+%s" mh-test-rel-folder))))))
+    ;; Folder with trailing slash not tested since
+    ;; mh-normalize-folder-name would strip it.
+    (should (equal
+             nil
+             (mh-sub-folders-actual (format "+%s/foo" mh-test-rel-folder))))
+
+    (should (equal
+             (list (list "bar") (list "foo") (list "food"))
+             (mh-sub-folders-actual (format "+%s" mh-test-abs-folder))))
+
+    ;; FIXME: mh-sub-folders-actual doesn't (yet) expect to be given a
+    ;; nonexistent folder.
+    ;;   (should (equal nil
+    ;;                  (mh-sub-folders-actual "+nosuchfolder")))
+    ;;   (should (equal nil
+    ;;                  (mh-sub-folders-actual "+/nosuchfolder")))
+    ))
+
+(ert-deftest mh-sub-folders ()
+  "Test `mh-sub-folders'."
+  (with-mh-test-env
+    (should (equal mh-test-rel-folder
+                   (car (assoc mh-test-rel-folder (mh-sub-folders nil)))))
+    (should (equal mh-test-rel-folder
+                   (car (assoc mh-test-rel-folder (mh-sub-folders "")))))
+    (should (equal nil
+                   (car (assoc mh-test-no-such-folder (mh-sub-folders
+                                                       "+")))))
+    (should (equal (list (list "bar") (list "foo") (list "food"))
+                   (mh-sub-folders (format "+%s" mh-test-rel-folder))))
+    (should (equal (list (list "bar") (list "foo") (list "food"))
+                   (mh-sub-folders (format "+%s/" mh-test-rel-folder))))
+    (should (equal nil
+                   (mh-sub-folders (format "+%s/foo/" mh-test-rel-folder))))
+    (should (equal nil
+                   (mh-sub-folders (format "+%s/foo" mh-test-rel-folder))))
+    (should (equal (list (list "bar") (list "foo") (list "food"))
+                   (mh-sub-folders (format "+%s" mh-test-abs-folder))))
+
+    ;; FIXME: mh-sub-folders doesn't (yet) expect to be given a
+    ;; nonexistent folder.
+    ;;   (should (equal nil
+    ;;                  (mh-sub-folders "+nosuchfolder")))
+    ;;   (should (equal nil
+    ;;                  (mh-sub-folders "+/nosuchfolder")))
+    ))
+
+
+(defmacro mh-test-folder-completion-1 (name
+                                       nil-expected t-expected lambda-expected)
+  "Helper for testing `mh-folder-completion-function'.
+Ask for completion on NAME three times, with three different
+values for the FLAG argument of `mh-folder-completion-function'.
+NIL-EXPECTED is the expected value with FLAG nil.
+T-EXPECTED is the expected value with FLAG t.
+LAMBDA-EXPECTED is the expected value with FLAG lambda."
+  `(with-mh-test-env
+     (mh-test-folder-completion-2 ,nil-expected ;case "a"
+                                  (mh-folder-completion-function ,name nil 
nil))
+     (mh-test-folder-completion-2 ,t-expected ;case "b"
+                                  (mh-folder-completion-function ,name nil t))
+     (mh-test-folder-completion-2 ,lambda-expected ;case "c"
+                                  (mh-folder-completion-function ,name nil
+                                                                 'lambda))))
+
+(defmacro mh-test-folder-completion-2 (expected actual)
+  "Inner helper for testing `mh-folder-completion-function'.
+ACTUAL should evaluate to either EXPECTED or to a list containing EXPECTED.
+ACTUAL may be evaluated twice, but this gives a clearer error on failure,
+and the `should' macro requires idempotent evaluation anyway."
+  `(if (and (not (consp ,expected)) (consp ,actual))
+       (should (member ,expected ,actual))
+     (should (equal ,expected ,actual))))
+
+
+(ert-deftest mh-folder-completion-function-02-empty ()
+  "Test `mh-folder-completion-function' with empty name."
+  (mh-test-folder-completion-1 "" "+" (format "%s/" mh-test-rel-folder) nil))
+
+(ert-deftest mh-folder-completion-function-03-plus ()
+  "Test `mh-folder-completion-function' with `+'."
+  (mh-test-folder-completion-1 "+" "+" (format "%s/" mh-test-rel-folder) nil))
+
+(ert-deftest mh-folder-completion-function-04-rel-folder ()
+  "Test `mh-folder-completion-function' with `+rela-folder'."
+  (mh-test-folder-completion-1 (format "+%s" mh-test-rel-folder)
+                               (format "+%s/" mh-test-rel-folder)
+                               (list (format "%s/" mh-test-rel-folder))
+                               t))
+
+(ert-deftest mh-folder-completion-function-05-rel-folder-slash ()
+  "Test `mh-folder-completion-function' with `+rela-folder/'."
+  (mh-test-folder-completion-1 (format "+%s/" mh-test-rel-folder)
+                               (format "+%s/" mh-test-rel-folder)
+                               (list "bar" "foo" "food")
+                               t))
+
+(ert-deftest mh-folder-completion-function-06-rel-folder-slash-foo ()
+  "Test `mh-folder-completion-function' with `+rela-folder/foo'."
+  (mh-test-folder-completion-1 (format "+%s/foo" mh-test-rel-folder)
+                               (format "+%s/foo" mh-test-rel-folder)
+                               (list "foo" "food")
+                               t)
+  (with-mh-test-env
+    (should (equal nil
+                   (mh-folder-completion-function
+                    (format "+%s/fo" mh-test-rel-folder) nil 'lambda)))))
+
+(ert-deftest mh-folder-completion-function-07-rel-folder-slash-foo-slash ()
+  "Test `mh-folder-completion-function' with `+rela-folder/foo/'."
+  (mh-test-folder-completion-1 (format "+%s/foo/" mh-test-rel-folder)
+                               nil
+                               nil
+                               t))
+
+(ert-deftest mh-folder-completion-function-08-plus-slash ()
+  "Test `mh-folder-completion-function' with `+/'."
+  :expected-result :failed              ;to be fixed in a patch by mkupfer
+  (mh-test-folder-completion-1 "+/" "+/" "tmp/" nil)
+    ;; case "bb"
+    (with-mh-test-env
+      (should (equal nil
+                     (member (format "+%s/" mh-test-rel-folder)
+                             (mh-folder-completion-function "+/" nil t))))))
+
+(ert-deftest mh-folder-completion-function-09-plus-slash-tmp ()
+  "Test `mh-folder-completion-function' with `+/tmp'."
+  :expected-result :failed              ;to be fixed in a patch by mkupfer
+  (mh-test-folder-completion-1 "+/tmp" "+/tmp" "tmp/" t))
+
+(ert-deftest mh-folder-completion-function-10-plus-slash-abs-folder ()
+  "Test `mh-folder-completion-function' with `+/abso-folder'."
+  (mh-test-folder-completion-1 (format "+%s/" mh-test-abs-folder)
+                               (format "+%s/" mh-test-abs-folder)
+                               (list "bar" "foo" "food")
+                               t))
+
+(ert-deftest mh-folder-completion-function-11-plus-slash-abs-folder-slash-foo 
()
+  "Test `mh-folder-completion-function' with `+/abso-folder/foo'."
+  (mh-test-folder-completion-1 (format "+%s/foo" mh-test-abs-folder)
+                               (format "+%s/foo" mh-test-abs-folder)
+                               (list "foo" "food")
+                               t)
+  (with-mh-test-env
+    (should (equal nil
+                   (mh-folder-completion-function
+                    (format "+%s/fo" mh-test-abs-folder) nil 'lambda)))))
+
+(ert-deftest mh-folder-completion-function-12-plus-nosuchfolder ()
+  "Test `mh-folder-completion-function' with `+nosuchfolder'."
+  (mh-test-folder-completion-1 "+nosuchfolder" nil nil nil))
+
+(ert-deftest mh-folder-completion-function-13-plus-slash-nosuchfolder ()
+  "Test `mh-folder-completion-function' with `+/nosuchfolder'."
+  (mh-test-folder-completion-1 "+/nosuchfolder" nil nil nil))
+
+;;; mh-utils-tests.el ends here
diff --git a/test/lisp/mh-e/mh-xface-tests.el b/test/lisp/mh-e/mh-xface-tests.el
index 65e3c82ec0..43355810ab 100644
--- a/test/lisp/mh-e/mh-xface-tests.el
+++ b/test/lisp/mh-e/mh-xface-tests.el
@@ -33,3 +33,18 @@
   (should (equal (mh-x-image-url-sane-p "https:") t))
   (should (equal (mh-x-image-url-sane-p "https://www.example.com/me.png";) t))
   (should (equal (mh-x-image-url-sane-p "abcde:") nil)))
+
+(ert-deftest mh-x-image-url-cache-canonicalize ()
+  "Test `mh-x-image-url-cache-canonicalize'."
+  (should (equal (format "%s/%s" mh-x-image-cache-directory "%21foo%21bar.png")
+                 (mh-x-image-url-cache-canonicalize "/foo/bar")))
+  (should (equal (format "%s/%s" mh-x-image-cache-directory
+                         "http%3A%21%21domain.com%21foo%21bar.png")
+                 (mh-x-image-url-cache-canonicalize
+                  "http://domain.com/foo/bar";)))
+  ;; All Windows invalid characters.
+  (should (equal (format "%s/%s" mh-x-image-cache-directory
+                         "%21%3C%3E%3A%2A%3F%22%5C%7C%21bar.png")
+                 (mh-x-image-url-cache-canonicalize "/<>:*?\"\\|/bar"))))
+
+;;; mh-xface-tests.el ends here
diff --git a/test/lisp/net/network-stream-tests.el 
b/test/lisp/net/network-stream-tests.el
index 4a0b23dd26..8f5bddb71f 100644
--- a/test/lisp/net/network-stream-tests.el
+++ b/test/lisp/net/network-stream-tests.el
@@ -611,7 +611,7 @@
   (skip-unless (gnutls-available-p))
   (let ((server (make-tls-server 44667))
         (times 0)
-        nowait
+        (nowait nil) ; Workaround Bug#47080
         proc status)
     (unwind-protect
         (progn
diff --git a/test/lisp/progmodes/python-tests.el 
b/test/lisp/progmodes/python-tests.el
index 1af579bb7a..6ab9c62746 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -193,7 +193,6 @@ aliqua."
 
 (ert-deftest python-syntax-after-python-backspace ()
   ;; `python-indent-dedent-line-backspace' garbles syntax
-  :expected-result :failed
   (python-tests-with-temp-buffer
       "\"\"\""
     (goto-char (point-max))
@@ -5283,7 +5282,7 @@ urlpatterns = patterns('',
            (should (= (current-indentation) 23))))
       (or eim (electric-indent-mode -1)))))
 
-(ert-deftest python-triple-quote-pairing ()
+(ert-deftest python-triple-double-quote-pairing ()
   (let ((epm electric-pair-mode))
     (unwind-protect
         (progn
@@ -5310,6 +5309,33 @@ urlpatterns = patterns('',
                             "\"\n\"\"\"\n"))))
       (or epm (electric-pair-mode -1)))))
 
+(ert-deftest python-triple-single-quote-pairing ()
+  (let ((epm electric-pair-mode))
+    (unwind-protect
+        (progn
+          (python-tests-with-temp-buffer
+           "''\n"
+           (or epm (electric-pair-mode 1))
+           (goto-char (1- (point-max)))
+           (python-tests-self-insert ?')
+           (should (string= (buffer-string)
+                            "''''''\n"))
+           (should (= (point) 4)))
+          (python-tests-with-temp-buffer
+           "\n"
+           (python-tests-self-insert (list ?' ?' ?'))
+           (should (string= (buffer-string)
+                            "''''''\n"))
+           (should (= (point) 4)))
+          (python-tests-with-temp-buffer
+           "'\n''\n"
+           (goto-char (1- (point-max)))
+           (python-tests-self-insert ?')
+           (should (= (point) (1- (point-max))))
+           (should (string= (buffer-string)
+                            "'\n'''\n"))))
+      (or epm (electric-pair-mode -1)))))
+
 
 ;;; Hideshow support
 
diff --git a/test/lisp/so-long-tests/so-long-tests.el 
b/test/lisp/so-long-tests/so-long-tests.el
index 8e4597c946..7eee345aad 100644
--- a/test/lisp/so-long-tests/so-long-tests.el
+++ b/test/lisp/so-long-tests/so-long-tests.el
@@ -229,7 +229,7 @@
               ((obsolete run-window-configuration-change-hook))
             (run-window-configuration-change-hook)))))
     (so-long-tests-assert-and-revert 'so-long-mode))
-  ;; `so-long-invisible-buffer-function' is `nil'.
+  ;; `so-long-invisible-buffer-function' is nil.
   (with-temp-buffer
     (insert "#!emacs\n")
     (normal-mode)
diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el
index 54bee7bc75..695da10408 100644
--- a/test/lisp/subr-tests.el
+++ b/test/lisp/subr-tests.el
@@ -492,11 +492,11 @@ See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19350.";
   (should (equal subr-tests--hook '(f5 f2 f1 f4 f3)))
   (add-hook 'subr-tests--hook 'f6)
   (should (equal subr-tests--hook '(f5 f6 f2 f1 f4 f3)))
-  ;; Make sure `t' is equivalent to 90.
+  ;; Make sure t is equivalent to 90.
   (add-hook 'subr-tests--hook 'f7 90)
   (add-hook 'subr-tests--hook 'f8 t)
   (should (equal subr-tests--hook '(f5 f6 f2 f1 f4 f3 f7 f8)))
-  ;; Make sure `nil' is equivalent to 0.
+  ;; Make sure nil is equivalent to 0.
   (add-hook 'subr-tests--hook 'f9 0)
   (add-hook 'subr-tests--hook 'f10)
   (should (equal subr-tests--hook '(f5 f10 f9 f6 f2 f1 f4 f3 f7 f8)))
@@ -767,5 +767,10 @@ See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19350.";
       (should-not (equal dir default-directory))
       (should (file-exists-p default-directory)))))
 
+(ert-deftest test-ensure-list ()
+  (should (equal (ensure-list nil) nil))
+  (should (equal (ensure-list :foo) '(:foo)))
+  (should (equal (ensure-list '(1 2 3)) '(1 2 3))))
+
 (provide 'subr-tests)
 ;;; subr-tests.el ends here
diff --git a/test/lisp/url/url-auth-tests.el b/test/lisp/url/url-auth-tests.el
index ff30f10025..05ccfc0d12 100644
--- a/test/lisp/url/url-auth-tests.el
+++ b/test/lisp/url/url-auth-tests.el
@@ -154,7 +154,7 @@ Essential is how realms and paths are matched."
          auth)
 
     (dolist (row (list
-                  ;; If :expected-user is `nil' it indicates
+                  ;; If :expected-user is nil it indicates
                   ;; authentication information shouldn't be found.
 
                   ;; non-existent server
diff --git a/test/src/fileio-tests.el b/test/src/fileio-tests.el
index f4d123b426..438ebebb76 100644
--- a/test/src/fileio-tests.el
+++ b/test/src/fileio-tests.el
@@ -136,6 +136,15 @@ Also check that an encoding error can appear in a symlink."
     (should (and (file-name-absolute-p name)
                  (not (eq (aref name 0) ?~))))))
 
+(ert-deftest fileio-test--expand-file-name-null-bytes ()
+  "Test that expand-file-name checks for null bytes in filenames."
+  (should-error (expand-file-name (concat "file" (char-to-string ?\0) ".txt"))
+                :type 'wrong-type-argument)
+  (should-error (expand-file-name "file.txt" (concat "dir" (char-to-string 
?\0)))
+                :type 'wrong-type-argument)
+  (let ((default-directory (concat "dir" (char-to-string ?\0))))
+    (should-error (expand-file-name "file.txt") :type 'wrong-type-argument)))
+
 (ert-deftest fileio-tests--file-name-absolute-p ()
   "Test file-name-absolute-p."
   (dolist (suffix '("" "/" "//" "/foo" "/foo/" "/foo//" "/foo/bar"))
diff --git a/test/src/fns-tests.el b/test/src/fns-tests.el
index 9f6593a177..bd5a4358e6 100644
--- a/test/src/fns-tests.el
+++ b/test/src/fns-tests.el
@@ -786,7 +786,15 @@
   ;; string containing hanzi character, compare by character
   (should (equal 2 (string-distance "ab" "ab我她")))
   (should (equal 1 (string-distance "ab" "a我b")))
-  (should (equal 1 (string-distance "我" "她"))))
+  (should (equal 1 (string-distance "我" "她")))
+
+  ;; correct behaviour with empty strings
+  (should (equal 0 (string-distance "" "")))
+  (should (equal 0 (string-distance "" "" t)))
+  (should (equal 1 (string-distance "x" "")))
+  (should (equal 1 (string-distance "x" "" t)))
+  (should (equal 1 (string-distance "" "x")))
+  (should (equal 1 (string-distance "" "x" t))))
 
 (ert-deftest test-bignum-eql ()
   "Test that `eql' works for bignums."
diff --git a/test/src/keymap-tests.el b/test/src/keymap-tests.el
index a9b0cb502d..68b42c346c 100644
--- a/test/src/keymap-tests.el
+++ b/test/src/keymap-tests.el
@@ -269,7 +269,8 @@ commit 86c19714b097aa477d339ed99ffb5136c755a046."
         (shadow-map (let ((map (make-keymap)))
                       (define-key map "f" 'bar)
                       map))
-        (text-quoting-style 'grave))
+        (text-quoting-style 'grave)
+        (describe-bindings-check-shadowing-in-ranges 'ignore-self-insert))
     (with-temp-buffer
       (help--describe-vector (cadr orig-map) nil #'help--describe-command
                              t shadow-map orig-map t)
diff --git a/test/src/minibuf-tests.el b/test/src/minibuf-tests.el
index c55611eb84..feea1c112b 100644
--- a/test/src/minibuf-tests.el
+++ b/test/src/minibuf-tests.el
@@ -406,7 +406,7 @@
     (should (equal (try-completion "bar" '("bArfoo" "barbaz"))
                    (try-completion "bar" '("barbaz" "bArfoo"))))
     ;; bug#11339
-    (should (equal (try-completion "baz" '("baz" "bAz")) "baz")) ;And not `t'!
+    (should (equal (try-completion "baz" '("baz" "bAz")) "baz")) ;And not t!
     (should (equal (try-completion "baz" '("bAz" "baz"))
                    (try-completion "baz" '("baz" "bAz"))))))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]